注意事项:
1.springMVC中上传文件使用的类是MultipartFile。
2.得到文件的扩展名:
//得到文件的原始名称
String originalFilename = multipartFile.getOriginalFilename();
//得到文件的扩展名
String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
3.通过表单提交过来的数据,永远是JSON格式的数据.所以对于metadata虽然是Map类型的,但是我们依然需要用String进行接收,然后在转换成map格式。在设置到文件中,保存到数据库中。
Map map = JSON.parseObject(metadata, Map.class);
1.步骤
1.初始化fastDFS环境
2.将文件上传到fastDFS中,得到一个文件id
3.将文件id及其它文件信息存储到mongodb中FileSystem数据库中的数据库中。
当前端调用上面集成的方法后,会获取到文件id,此时进行第4步操作。
4.想要使用具体的图片,还需要保存图片返回的文件id和具体的服务id保存到mysql数据库中。
2.1yml文件中FastDFS的配置:
xuecheng:
fastdfs:
connect_timeout_in_seconds: 5
network_timeout_in_seconds: 30
charset: UTF-8
tracker_servers: 192.168.101.65:22122 #多个 trackerServer中间以逗号分隔
2.2初始化fastDFS环境
@Value("${xuecheng.fastdfs.tracker_servers}")
String tracker_servers;
@Value("${xuecheng.fastdfs.connect_timeout_in_seconds}")
int connect_timeout_in_seconds;
@Value("${xuecheng.fastdfs.network_timeout_in_seconds}")
int network_timeout_in_seconds;
@Value("${xuecheng.fastdfs.charset}")
String charset;
//初始化fastDFS环境
private void initFastDFSCofig(){
try {
ClientGlobal.initByTrackers(tracker_servers);
ClientGlobal.setG_charset(charset);
ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);
ClientGlobal.setG_network_timeout(network_timeout_in_seconds);
} catch (Exception e) {
e.printStackTrace();
ExceptionCast.cast(FileSystemCode.FS_INITFDFSERROR);
}
}
如果配置文件使用的是.properties,那么可以直接使用
ClientGlobal.initByProperties("config/fastdfs-client.properties");
加载fastdfs-client.properties配置文件
2.2上传文件到fastDFS中
/**
* 上传文件到fastDFS
* @param multipartFile
* @return
*/
private String fafs_upload(MultipartFile multipartFile){
//初始化fastDFS的环境
initFastDFSCofig();
//创建trackerClient
TrackerClient trackerClient = new TrackerClient();
try {
TrackerServer trackerServer = trackerClient.getConnection();
//得到storage服务器
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建storageClient来上传文件
StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage);
//上传文件,得到文件字节
byte[] bytes = multipartFile.getBytes();
//得到文件的原始名称
String originalFilename = multipartFile.getOriginalFilename();
//得到文件的扩展名
String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
String fileId = storageClient1.upload_file1(bytes, ext, null);
return fileId;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
2.3总步骤,到上传到MongDB数据库上进行文件的保存
/**
* 上传文件
* @param multipartFile
* @param filetag:文件标签
* @param businesskey:业务key
* @param metadata:元信息,json格式
* @return
*/
public UploadFileResult upload(MultipartFile multipartFile,
String filetag,
String businesskey,
String metadata){
if(multipartFile==null){
ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);
}
//第一步:将文件上传到fastDFS中,得到一个文件id
String fileId = fafs_upload(multipartFile);
if(StringUtils.isEmpty(fileId)){
ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_SERVERFAIL);
}
//第二步:将文件id及其它文件信息存储到mongodb中。
FileSystem fileSystem = new FileSystem();
fileSystem.setFileId(fileId);
fileSystem.setFilePath(fileId);
fileSystem.setFiletag(filetag);
fileSystem.setBusinesskey(businesskey);
fileSystem.setFileName(multipartFile.getOriginalFilename());
fileSystem.setFileType(multipartFile.getContentType());
if(StringUtils.isNotEmpty(metadata)){
Map map = JSON.parseObject(metadata, Map.class);
fileSystem.setMetadata(map);
}
fileSystemRepository.save(fileSystem);
return new UploadFileResult(CommonCode.SUCCESS,fileSystem);
}
2.4 写保存图片和服务关联的方法如:
@ApiOperation("添加课程图片")
public ResponseResult addCoursePic(String courseId,String pic);