文件上传下载这个东西在项目中基本上是必需品,从网上找了许许多多的方法一般都在本地实现的,但是实际工作的都是要存储到服务器的,下面介绍存储到linux下的一种方法,有不足请多多指教。
这类建一个配置,把公共属性封装起来,在控制层直接注入就可以了
@Setter
@Getter
public class GlobalConfig {
/**
* 服务器内文件路径
*/
private String uploadPath;
private String fileUrl;
private String filePath;
}
下面是yml中的相关配置
``
//控制上传文件的属性`
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
global-config:
file-url: 服务器的ip地址
//这里的路径可以切换,如果是本地windows就用第一行,linux就用第二行
#file-path: G:\\
file-path: /home/kemi/webapp/nfs/
先说上传,下面的上传文件支持批量上传,最后存储之后前端会返回一个url地址,只需要把地址入库即可,这里文件名没用随机名,增加用户的体验感,让他们舒服下
@Autowired
private GlobalConfig globalConfig;
@Autowired
private QbFileService fileService;
@ApiOperation("文件上传")
@RequestMapping(value = "fileupload",method = RequestMethod.POST,headers = "content-type=multipart/form-data")
public ApiResult fileUpload(@RequestParam(value = "file") MultipartFile[] file) throws Exception {
ApiResult result = new ApiResult();
String fileNames = "";
for (int i = 0; i <file.length ; i++) {
//获取随机名称
String originalName = file[i].getOriginalFilename();
String suffix = originalName.substring(originalName.lastIndexOf("."), originalName.length());
File dest = new File(globalConfig.getFilePath()+File.separator+originalName);
if (!dest.exists()){
dest.getParentFile().mkdirs();
}
try {
file[i].transferTo(dest);
} catch (Exception e) {
e.printStackTrace();
}
fileNames += globalConfig.getFileUrl()+globalConfig.getFilePath()+originalName + "&";
}
String[] urlArray = fileNames.substring(0, fileNames.length() - 1).split("&");
String[] urls = urlArray;
result.setData(urls);
return result;
}
下面是下载的方法,写这个下载可废老劲了,之前没有解除过请求头的一些属性,到对接是发现各种奇葩错误,下面的方法对于上传的文件是英文加数字的可以把方法中service方法注释了, 直接实用,如果是中文名称,就需要建一个文件表,原因是前端传过来的中文是经过转义的,小老弟我从网上找了好几种方法发现还是不行,逼不得已建了文件表。
文件表的属性
id name url createtime 我是感觉这4个字段够用了
建好表之后把代码自动生成就好了,我就不写了,如果有疑问可以给我发私信或者直接评论,
```java
@ApiOperation("下载文件")
@RequestMapping(value="download/",method=RequestMethod.GET)
public String download(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response){
InputStream inputStream = null;
OutputStream outputStream = null;
try {
String fileName = fileService.get(id).getName();
String filepath = globalConfig.getFilePath() + fileName;
File file = new File(filepath);
if(file.exists()){
String c = fileName.split("\\.")[0];
String type = filepath.split("\\.")[1];
System.out.println(type);
inputStream = new FileInputStream(filepath);
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
response.reset();
response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
response.setHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Content-Length", "" + file.length());
response.setContentType("application/octet-stream"); //最好配置一个下载目录表(所有的数据放到下载表中,其他的地方就志存一个ID)
response.setHeader("Content-Disposition", "attachment; filename="+java.net.URLEncoder.encode(c, "UTF-8")+"."+type);
outputStream =response.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
}
return "没有找到文件";
} catch (Exception e) {
return "You failed to download => " + e.getMessage();
}
finally {
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
觉得有用的话,给咸鱼小老弟点个赞,好哥哥们好姐姐们