springboot实现文件上传和下载功能
springboot引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心。大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码。
1.文件上传(前端页面):
Inserttitlehere 下载
表单提交加上enctype="multipart/form-data"很重要,文件以二进制流的形式传输。
2.文件上传(后端java代码)支持多文件
Way1.使用MultipartHttpServletRequest来处理上传请求,然后将接收到的文件以流的形式写入到服务器文件中:
@RequestMapping(value="/testUpload",method=RequestMethod.POST) publicvoidtestUploadFile(HttpServletRequestreq,MultipartHttpServletRequestmultiReq)throwsIOException{ FileOutputStreamfos=newFileOutputStream(newFile("F://test//src//file//upload.jpg")); FileInputStreamfs=(FileInputStream)multiReq.getFile("file").getInputStream(); byte[]buffer=newbyte[1024]; intlen=0; while((len=fs.read(buffer))!=-1){ fos.write(buffer,0,len); } fos.close(); fs.close(); }
Way2.也可以这样来取得上传的file流:
//文件上传 @RequestMapping("/fileUpload") publicMapfileUpload(@RequestParam("file")MultipartFilefile,HttpServletRequestreq){ Mapresult=newHashMap(); SimpleDateFormatdf=newSimpleDateFormat("yyyyMMdd");//设置日期格式 StringdateDir=df.format(newDate());//newDate()为获取当前系统时间 StringserviceName=UuidUtil.get32UUID() +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); FiletempFile=newFile(fileDir+dateDir+File.separator+serviceName); if(!tempFile.getParentFile().exists()){ tempFile.getParentFile().mkdirs(); } if(!file.isEmpty()){ try{ BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(tempFile)); //"d:/"+file.getOriginalFilename()指定目录 out.write(file.getBytes()); out.flush(); out.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); result.put("msg","上传失败,"+e.getMessage()); result.put("state",false); returnresult; }catch(IOExceptione){ e.printStackTrace(); result.put("msg","上传失败,"+e.getMessage()); result.put("state",false); returnresult; } result.put("msg","上传成功"); StringfileId=Get8uuid.generateShortUuid(); StringfileName=file.getOriginalFilename(); StringfileType=fileName.substring(fileName.lastIndexOf(".")+1); StringfileUrl=webDir+dateDir+'/'+serviceName; uploadMapper.saveFileInfo(fileId,serviceName,fileType,fileUrl); result.put("state",true); returnresult; }else{ result.put("msg","上传失败,因为文件是空的"); result.put("state",false); returnresult; }
3.application.properties配置文件
#上传文件大小设置 multipart.maxFileSize=500Mb multipart.maxRequestSize=500Mb
4.文件下载将文件写到输出流里:
@RequestMapping(value="/testDownload",method=RequestMethod.GET) publicvoidtestDownload(HttpServletResponseres)throwsIOException{ Filefile=newFile("C:/test.txt"); resp.setHeader("content-type","application/octet-stream"); resp.setContentType("application/octet-stream"); resp.setHeader("Content-Disposition","attachment;filename="+fileName); byte[]buff=newbyte[1024]; BufferedInputStreambis=null; OutputStreamos=null; try{ os=resp.getOutputStream(); bis=newBufferedInputStream(newFileInputStream(file)); inti=bis.read(buff); while(i!=-1){ os.write(buff,0,buff.length); os.flush(); i=bis.read(buff); } }catch(IOExceptione){ e.printStackTrace(); }finally{ if(bis!=null){ try{ bis.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }
5.获取文件大小
//文件大小转换 DecimalFormatdf1=newDecimalFormat("0.00"); StringfileSizeString=""; longfileSize=file.getSize(); if(fileSize<1024){ fileSizeString=df1.format((double)fileSize)+"B"; }elseif(fileSize<1048576){ fileSizeString=df1.format((double)fileSize/1024)+"K"; }elseif(fileSize<1073741824){ fileSizeString=df1.format((double)fileSize/1048576)+"M"; }else{ fileSizeString=df1.format((double)fileSize/1073741824)+"G"; }
如果是File类则fileSize=file.length()。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。