一 引入坐标
<!-- 分布式文件系统 -->
<dependency>
<groupId>org.csource.fastdfs</groupId>
<artifactId>fastdfs</artifactId>
<version>1.2</version>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
二 分布web 使用的 配置多媒体解析器 添加配置文件
springmvc.xml文件增加
//等你忘记配置下面的东西,会看到这个错误图示,加上就ok了
//java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?]
<!-- 配置多媒体解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值 5MB, 5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
fdfs_client.conf
# connect timeout in seconds
# default value is 30s
connect_timeout=30
# network timeout in seconds
# default value is 30s
network_timeout=60
# the base path to store log files
base_path=/home/fastdfs
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.168.25.133:22122
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info
# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600
# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false
# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false
# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf
三 前端部分 (单图片上传)
app.service("uploadService",function ($http) {
this.uploadFile = function () {
var formData = new FormData(); //上传文件的数据模型
//参数名对应contorller中的参数名 参数内容
formData.append("uploadFile", file.files[0]); //文件上传框的id必须是和append的第二个参数一致
return $http({
method : 'post',
url : "../upload.do",
data : formData,
headers : {'Content-Type' : undefined}, //上传文件必须是这个类型,默认text/plain
transformRequest : angular.identity //对整个表单进行二进制序列化
});
}
})
四 使用工具类
package util;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
public class FastDFSClient {
private TrackerClient trackerClient = null;
private TrackerServer trackerServer = null;
private StorageServer storageServer = null;
private StorageClient1 storageClient = null;
public FastDFSClient(String conf) throws Exception {
if (conf.contains("classpath:")) {
conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
}
ClientGlobal.init(conf);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageServer = null;
storageClient = new StorageClient1(trackerServer, storageServer);
}
/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileName 文件全路径
* @param extName 文件扩展名,不包含(.)
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
String result = storageClient.upload_file1(fileName, extName, metas);
return result;
}
public String uploadFile(String fileName) throws Exception {
return uploadFile(fileName, null, null);
}
public String uploadFile(String fileName, String extName) throws Exception {
return uploadFile(fileName, extName, null);
}
/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileContent 文件的内容,字节数组
* @param extName 文件扩展名
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
String result = storageClient.upload_file1(fileContent, extName, metas);
return result;
}
public String uploadFile(byte[] fileContent) throws Exception {
return uploadFile(fileContent, null, null);
}
public String uploadFile(byte[] fileContent, String extName) throws Exception {
return uploadFile(fileContent, extName, null);
}
}
五 controller 代码 完成上传功能 返回所在服务的路径
package com.pinyougou.shop.controller;
import com.pinyougou.entity.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import util.FastDFSClient;
public class UploadController {
private String server_url = "http://192.168.25.133/";
@RequestMapping("upload")
public Result upload(MultipartFile uploadFile) {
//file上传到fastdfs
try {
String filename = uploadFile.getOriginalFilename();//获取上传过来的文件名
String extName = filename.substring(filename.lastIndexOf(".") + 1); //截取出后缀名
//使用工具类 传入配置文件路径
FastDFSClient client = new FastDFSClient("classpath:config/fdfs_client.conf");
//参数1:文件字节码 参数2:文件扩展名 返回fastdfs当前文件位置路径 也是名字
String url = client.uploadFile(uploadFile.getBytes(), extName);
return new Result(true,server_url+url);
} catch (Exception e) {
e.printStackTrace();
return new Result(false,"上传失败");
}
}
}