Springboot 文件上传和下载 实用!!!

文件上传下载这个东西在项目中基本上是必需品,从网上找了许许多多的方法一般都在本地实现的,但是实际工作的都是要存储到服务器的,下面介绍存储到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();
				}
			}
		}
	}

觉得有用的话,给咸鱼小老弟点个赞,好哥哥们好姐姐们



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值