FastDFS分布式文件系统--整合Java代码并解决服务器跨域问题

来源:互联网 发布:win8.1怎么优化才流畅 编辑:程序博客网 时间:2024/06/07 13:26

文件服务器与java整合是有对应的工具包的,自己可以去下载 fastdfs-client-java.jar

然后自己创建一个maven web项目,下面就帖代码:
maven的pom.xml,如下:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.zlh</groupId>    <artifactId>fastdfs</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>war</packaging>    <name>fastdfs</name>    <url>http://maven.apache.org</url>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>3.8.1</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.csource</groupId>            <artifactId>fastdfs-client-java</artifactId>            <version>5.0.5</version>        </dependency>        <dependency>            <groupId>commons-io</groupId>            <artifactId>commons-io</artifactId>            <version>2.4</version>        </dependency>        <!-- spring 的基本依赖 开始 -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-expression</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-tx</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aspects</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>4.1.2.RELEASE</version>        </dependency>        <!-- spring 的基本依赖 结束 -->        <!-- json -->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.6</version>        </dependency>        <dependency>            <groupId>com.sun.jersey.contribs</groupId>            <artifactId>jersey-multipart</artifactId>            <version>1.19.4</version>        </dependency>        <dependency>            <groupId>com.sun.jersey</groupId>            <artifactId>jersey-client</artifactId>            <version>1.19.4</version>        </dependency>        <dependency>            <groupId>commons-fileupload</groupId>            <artifactId>commons-fileupload</artifactId>            <version>1.3.3</version>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>servlet-api</artifactId>            <version>2.5</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.6.4</version>        </dependency>        <dependency>            <groupId>net.sf.json-lib</groupId>            <artifactId>json-lib</artifactId>            <version>2.2.3</version>        </dependency>        <dependency>            <groupId>org.apache.ant</groupId>            <artifactId>ant</artifactId>            <version>1.6.5</version>        </dependency>        <dependency>            <groupId>java.unrar</groupId>            <artifactId>unrar</artifactId>            <version>0.5</version>        </dependency>        <dependency>            <groupId>commons-lang</groupId>            <artifactId>commons-lang</artifactId>            <version>2.6</version>        </dependency>    </dependencies>    <build>        <finalName>fastdfs</finalName>        <!-- 配置工程编译级别 -->        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.7</source>                    <target>1.7</target>                </configuration>            </plugin>        </plugins>    </build></project>

这是Controller类:

package com.zlh.fastdfs.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;import org.csource.fastdfs.StorageClient;import org.csource.fastdfs.StorageServer;import org.csource.fastdfs.TrackerClient;import org.csource.fastdfs.TrackerServer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import com.zlh.fastdfs.common.BaseView;import com.zlh.fastdfs.common.FileView;import com.zlh.fastdfs.common.PropertitesUtil;/** * 文件名称: com.zlh.fastdfs.controller.FastdfsController.java</br> * 初始作者: ZLH</br> * 创建日期: 2017年8月22日</br> * 功能说明: 这里用一句话描述这个类的作用--此句话需删除 <br/> * =================================================<br/> * 修改记录:<br/> * 修改作者 日期 修改内容<br/> * ================================================<br/> * Copyright (c) 2010-2011 .All rights reserved.<br/> */@RestController@RequestMapping("")public class FastdfsController {    private Logger                  logger          = LoggerFactory.getLogger(FastdfsController.class);    private static StorageClient    storageClient   = null;    static {        try {            ClientGlobal.init(PropertitesUtil.conf_filename);            TrackerClient tracker = new TrackerClient();            TrackerServer trackerServer = tracker.getConnection();            StorageServer storageServer = null;            storageClient = new StorageClient(trackerServer, storageServer);        } catch (Exception e) {            e.printStackTrace();        }    }    @RequestMapping(value = "upload", method = RequestMethod.POST)    public Object upload(MultipartFile attach, HttpServletRequest request, HttpServletResponse response) {        FileView fileView = new FileView();        try {            NameValuePair nvp[] = new NameValuePair[] {                    new NameValuePair("fileName", attach.getOriginalFilename()),                    new NameValuePair("type", attach.getContentType()),                    new NameValuePair("ext",                       PropertitesUtil.getFilenameExt(attach.getOriginalFilename())),                    new NameValuePair("size", Long.valueOf(attach.getSize()).toString())            };            String fileIds[] = storageClient.upload_file(attach.getBytes(),                    PropertitesUtil.getFilenameExt(attach.getOriginalFilename()), nvp);            fileView.setFileSize(Long.valueOf(attach.getSize()).toString());            fileView.setFileName(attach.getOriginalFilename());            fileView.setFilePath(fileIds[0] + "/" + fileIds[1]);            logger.info(fileIds.length + "");            logger.info("组名:" + fileIds[0]);            logger.info("路径: " + fileIds[1]);        } catch (Exception e) {            e.printStackTrace();            return new BaseView(false, "上传失败!");        }        return new BaseView(fileView);    }}

服务器应答公共实体类:

package com.zlh.fastdfs.common;import java.io.Serializable;/** * 文件名称: com.sdzkpt.common.utils.BaseView.java</br> * 初始作者: zlh</br> * 创建日期: 2016年8月11日</br> * 功能说明: 封装控制层返回给前端的状态描述,实体数据等 <br/> * =================================================<br/> * 修改记录:<br/> * 修改作者 日期 修改内容<br/> * ================================================<br/> * Copyright (c) 2010-2011 .All rights reserved.<br/> */public class BaseView implements Serializable {    /**     * 字段描述: [字段功能描述]     */    private static final long   serialVersionUID    = -3312282922207239793L;    /**     * 请求是否成功,true:成功,false:失败     */    private boolean             isSuccess;    /**     * 状态描述     */    private String              msgCode;    /**     * 待返回数据视图     */    private Object              data;    /**     * 方法描述: 默认无参构造器     */    public BaseView() {        isSuccess = true;        msgCode = "";    }    /**     * 方法描述: 指定状态与描述的构造器     *     * @param isSuccess     *            成功与否标志,true:成功,false:失败     * @param msgCode     *            状态码     */    public BaseView(boolean isSuccess, String msgCode) {        this.isSuccess = isSuccess;        this.msgCode = msgCode;    }    /**     * 方法描述: 指定特定类型数据视图,由于指定了数据,默认状态为成功,状态码为空,如需指定自定义状态码,请使用其他构造器     *     * @param data     *            待返回指定类型数据视图     */    public BaseView(Object data) {        isSuccess = true;        msgCode = "";        this.data = data;    }    /**     * 方法描述: 指定状态,描述及指定数据视图的构造器     *     * @param isSuccess     *            成功与否标志,true:成功,false:失败     * @param msgCode     *            状态码     * @param obj     *            待返回指定类型数据视图     */    public BaseView(boolean isSuccess, String msgCode, Object data) {        this.isSuccess = isSuccess;        this.msgCode = msgCode;        this.data = data;    }    /**     * 方法描述: 获取请求是否成功标志,true:成功,false:失败</br>     * 初始作者: zlh<br/>     * 创建日期: 2016年2月3日-下午5:41:51<br/>     * 开始版本: 2.0.0<br/>     * =================================================<br/>     * 修改记录:<br/>     * 修改作者 日期 修改内容<br/>     * ================================================<br/>     *     * @return     *         boolean 请求是否成功,true:成功,false:失败     */    public boolean getIsSuccess() {        return isSuccess;    }    /**     * 方法描述: 获取状态描述</br>     * 初始作者: zlh<br/>     * 创建日期: 2016年2月3日-下午5:42:25<br/>     * 开始版本: 2.0.0<br/>     * =================================================<br/>     * 修改记录:<br/>     * 修改作者 日期 修改内容<br/>     * ================================================<br/>     *     * @return     *         String 状态描述     */    public String getMsgCode() {        return msgCode;    }    /**     * 方法描述: 获取待返回的数据视图</br>     * 初始作者: zlh<br/>     * 创建日期: 2016年2月24日-上午11:37:20<br/>     * 开始版本: 2.0.0<br/>     * =================================================<br/>     * 修改记录:<br/>     * 修改作者 日期 修改内容<br/>     * ================================================<br/>     *     * @return     *         Object 指定类型的数据视图     */    public Object getData() {        return data;    }}

返回值实体类:

package com.zlh.fastdfs.common;import java.io.Serializable;/** * 文件名称: com.zlh.fastdfs.common.FileView.java</br> * 初始作者: zlh</br> * 创建日期: 2017年8月22日</br> * 功能说明: 这里用一句话描述这个类的作用--此句话需删除 <br/> * =================================================<br/> * 修改记录:<br/> * 修改作者 日期 修改内容<br/> * ================================================<br/> * Copyright (c) 2010-2011 .All rights reserved.<br/> */public class FileView implements Serializable {    /**     * 字段描述: [字段功能描述]     */    private static final long   serialVersionUID    = 1L;    private String              fileSize;    private String              fileName;    private String              filePath;    public String getFileSize() {        return fileSize;    }    public void setFileSize(String fileSize) {        this.fileSize = fileSize;    }    public String getFileName() {        return fileName;    }    public void setFileName(String fileName) {        this.fileName = fileName;    }    public String getFilePath() {        return filePath;    }    public void setFilePath(String filePath) {        this.filePath = filePath;    }}

读取配置工具类:

package com.zlh.fastdfs.common;/** * 文件名称: com.zlh.fastdfs.common.PropertitesUtil.java</br> * 初始作者: zlh</br> * 创建日期: 2017年8月22日</br> * 功能说明: 这里用一句话描述这个类的作用--此句话需删除 <br/> * =================================================<br/> * 修改记录:<br/> * 修改作者 日期 修改内容<br/> * ================================================<br/> * Copyright (c) 2010-2011 .All rights reserved.<br/> */public class PropertitesUtil extends ConfigurableContants {    // 静态初始化读入framework.properties中的设置    static {        init("/client.conf");    }    public static final String  conf_filename   = PropertitesUtil.class.getResource("/client.conf").getPath();    // public String conf_filename =getProperty(key, defaultValue);    public static String getFilenameExt(String fileName)    {        String fileExtName = "";        if (fileName == null || "".equals(fileName)) {            return null;        }        int nPos = fileName.lastIndexOf('.');        if (nPos > 0 && fileName.length() - nPos <= 7) {            fileExtName = fileName.substring(nPos + 1);        }        return fileExtName;    }}

整合的配置文件client.conf:

connect_timeout = 2network_timeout = 30charset = UTF-8http.tracker_http_port = 80http.anti_steal_token = notracker_server = 118.145.79.12:22122#tracker_server = 192.168.0.119:22122

springmvc的dispatcher-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xmlns:util="http://www.springframework.org/schema/util"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">    <!-- 配置controller层扫描包 -->    <context:component-scan base-package="com.zlh.fastdfs.controller" />    <!-- 支持上传文件 -->      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>      <!-- 配置应用参数 -->    <context:property-placeholder location="classpath:client.conf" ignore-unresolvable="true"/>    <!-- 注解驱动 -->    <mvc:annotation-driven>        <mvc:message-converters register-defaults="true">            <!--避免IE执行AJAX时,返回JSON出现下载文件 -->              <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">                  <property name="supportedMediaTypes">                    <list>                        <value>application/json;charset=UTF-8</value>                        <value>text/plain;charset=UTF-8</value>                             <value>text/html;charset=UTF-8</value>                    </list>                </property>                <property name="features">                      <list>                          <value>WriteDateUseDateFormat</value>                      </list>                  </property>            </bean>        </mvc:message-converters>      </mvc:annotation-driven>    <!-- 设置view resolver -->    <bean        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/jsp/" />        <property name="suffix" value=".jsp" />    </bean>    <mvc:default-servlet-handler/></beans>

web.xml:

<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" version="3.0"    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">    <context-param>        <param-name>fastdfs</param-name>        <param-value>webapp</param-value>    </context-param>    <!-- 统一编码过滤器 -->    <filter>        <filter-name>encodingFilter</filter-name>        <filter-class>            org.springframework.web.filter.CharacterEncodingFilter        </filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>    <!-- 配置Spring MVC DispatcherServlet -->      <servlet>          <servlet-name>springmvc</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <!-- 初始化参数 -->          <init-param>              <!-- 加载SpringMVC的xml到 spring的上下文容器中 -->              <param-name>contextConfigLocation</param-name>              <param-value>classpath:dispatcher-servlet.xml</param-value>          </init-param>          <load-on-startup>1</load-on-startup>      </servlet>    <servlet-mapping>          <servlet-name>springmvc</servlet-name>          <url-pattern>/fdfs/*</url-pattern>      </servlet-mapping></web-app>

以上就是java整合的代码,本人已测试可运行,并拿到文件服务器的返回值!有问题欢迎指正留言,谢谢,小弟荣幸之至!

我在网上之前也看了很多的整合事例都是本机运行的,但是我们实际中文件服务器肯定是和应用服务器是分开的,所以这里就会遇到一个很实际的问题就是–跨域访问–的问题,小弟才疏学浅,折腾了一天,最终得到解决,我现在把我遇到的坑说一下,给你们借鉴一下,希望能帮到你们,少走点弯路:

通过使用nginx代理:以我自己的事例,我本地应用想访问我某云上的文件服务器,我本地访问应用是用了nginx代理的,一开始我是直接通过ip+port访问这个web项目的,这种方式肯定是要报跨域错误的,后来我通过本地nginx代理web项目访问还是不行,直接报405不支持GET请求(因为上传我指定了POST),我很纳闷,怎么代理了一下变成GET请求了,最后我又在文件服务器的上的nginx代理了一波web项目(上一篇文章安装的nginx) ,最终的方式就是:本地的nginx代理 -代理请求-云上的nginx-然后云上的nginx代理请求最终的web项目-得到了最终的解决办法!
比如:

前端js 的url: http://127.0.0.1:8000/my-fdfs/

本地的nginx配置我监听的8000:
location /my-fdfs/ {
proxy_pass http://118.145.79.12/fastdfs/fdfs/upload/;
}
云上的nginx我监听的是80端口,所以上面代理的没写端口,

云上的nginx配置:
location /fastdfs/fdfs/upload/{
proxy_pass http://118.145.79.12:8081/fastdfs/fdfs/upload/;
}
这层代理是直接访问web项目的ip+port访问的

综上所述,可以解决跨域的问题,我的这种解决方案还希望大牛指点,不喜勿喷!
最后祝大家码的开心!

原创粉丝点击