JAVA SpringBoot学习之文件上传下载
客户端的图片下载分为两种,一种是以流的方式,一种是直接给个url地址进行展示。这里分别以两种方式记录,文件的上传下载
文件上传:
application.yml配置地址
fileConf:
savePath: C:\workspace\pragrammerFile\
visitPath: http://localhost:8760/
controller 部分:
@Autowired
FileService fileService;
@Value("${fileConf.savePath}")
private String fileSavePath;
@Value("${fileConf.visitPath}")
private String fileVisitPath;
@PostMapping("upload")
public Json upload(Long id,String type,String description,HttpServletRequest request) {
Json json=Json.buildSuccessResult();
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartFile=multipartRequest.getFile("file");
String contentType = multipartFile.getContentType(); //文件类型
String fileName = multipartFile.getOriginalFilename(); //名字
String fileSuffix = fileName.substring(
fileName.lastIndexOf("."), fileName.length());
UUID uuid = UUID.randomUUID();
File savePath=new File(fileSavePath);//创建文件夹
if (!savePath.exists()) {
savePath.mkdirs();
}
String uuidFileName = uuid.toString() + fileSuffix;
File file=new File(fileSavePath,uuidFileName);//拼接文件路径
multipartFile.transferTo(file);//保存到本地,其实transferTo底层依然使用的是IO流操作的,这里自己写io也可以
FileEntity fileEntity=new FileEntity();
fileEntity.setFileDescription(description);
fileEntity.setFileName(fileName);
fileEntity.setSize(FileUtils.getFileSize(multipartFile));
fileEntity.setFileType(contentType);
fileEntity.setPath(uuidFileName);
fileEntity.setUrl(fileVisitPath);
fileEntity.setModelId(id);
fileEntity.setModelType(type);
fileService.saveFile(fileEntity);
} catch (Exception e) {
json.buildErrorResponse(ApplicationResponseCode.FAIL,e.getMessage());
}
return json;
}
web端上传文件,我这里需要额外的参数id,type,description,所以要封装到FormData中进行传递
let uploadData = new FormData();
uploadData.append("file", file);
uploadData.append("id", "12");
uploadData.append("type", "News");
uploadData.append("description", file.name);
this.$putUploadFiles(uploadData, "/api/FileEntity/upload").then(
response => {
this.$success("上传成功");
}
);
下载文件
1.返回IO流
if (fileName == null) {
throw new BusinessException("1001", "文件名不能为空");
}
// 通过文件名查找文件信息
FileInfo fileInfo = fileInfoDao.findByFileName(fileName);
log.info("fileInfo-->{}", fileInfo);
if (fileInfo == null) {
throw new BusinessException("2001", "文件名不存在");
}
//设置响应头
res.setContentType("application/force-download");// 设置强制下载不打开
res.addHeader("Content-Disposition", "attachment;fileName=" +
new String(fileInfo.getFileOriginName().getBytes("gbk"), "iso8859-1"));// 设置文件名
res.setHeader("Context-Type", "application/xmsdownload");
//判断文件是否存在
File file = new File(Paths.get(fileInfo.getFilePath(), fileName).toString());
if (file.exists()) {
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = res.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
log.info("下载成功");
} catch (Exception e) {
e.printStackTrace();
throw new BusinessException("9999", e.getMessage());
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.直接返回url,
一般来说,想一些客户端,除非是一些非图片类型,一般是直接返回url的
第一步配置WebMvcConfigurer,
@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
private String fileSavePath="file:C:/workspace/pragrammerFile/";
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//指向外部目录
registry.addResourceHandler("img/**").addResourceLocations(fileSavePath);
}
}
其中fileSavePath:C:\workspace\pragrammerFile
而img就是虚拟的映射fileSavePat文件夹,所以最后完整地址就是
ip/img/文件名,
所以后端返回前端完整url即可,或者返回img/文件名,前端自己拼接
示例:
这里上传一张如下图片:
数据库:这里看到数据记录已经插入到文件表中。
接下来就去看C:\workspace\pragrammerFile\有没有文件生成
可以看到生成了文件。
下面直接在浏览器通过url+img/文件名去访问该图片,可以访问啦~