Java 文件上传下载
2019-02-20 00:46:54来源:博客园 阅读 ()
文件实体类
/** * 文件实体 * @author luochen */ @Entity @Table(name = "awards_attachment") public class AwardsAttachment { @Id @GeneratedValue private Long attachmentId; /** * 文件类型 */ private String attachmentType; /** * 文件名称 */ private String fileName; /** * 文件路径 */ private String filePath; /** * 创建时间 */ private Date createTime; /** * 修改时间 */ private Date updateTime; /** * 删除标识[1:删除,0正常] */ private String delflag; public String getDelflag() { return delflag; } public void setDelflag(String delflag) { this.delflag = delflag; } public Long getAttachmentId() { return attachmentId; } public void setAttachmentId(Long attachmentId) { this.attachmentId = attachmentId; } public String getAttachmentType() { return attachmentType; } public void setAttachmentType(String attachmentType) { this.attachmentType = attachmentType; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
文件的服务类和实现类就不写了,就是一些增删改查的方法。
文件上传控制类
/** * 资源下载 */ @RestController @RequestMapping("data") public class DataDownloadController { @Autowired private AwardsAttachmentService awardsAttachmentService; private static final Logger logger = LoggerFactory.getLogger(DataDownloadController.class); /** * 上传文件 * * @param upfile * @param type 文件类型 * @param request */ @PostMapping("/upload") @ApiOperation(value = "上传文件", notes = "上传文件", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @ApiImplicitParam(name = "upfile", value = "文件", required = true, dataType = "MultipartFile", paramType = "upfile") public JsonResponseExt uploadFile(@RequestParam(value = "file" ) MultipartFile upfile, @RequestParam(value = "type", required = false) String type, HttpServletRequest request) { //日期路径 String baseUrl = new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/"; //String host = request.getHeader("Origin").substring(0, request.getHeader("Origin").lastIndexOf(":")) + ":" + request.getLocalPort(); String host = request.getScheme()+"://"+request.getServerName() +":"+request.getLocalPort(); String prePath = ""; //返回结果集合 Map<String, String> map = new HashMap<>(); //路径前缀 prePath = PropertyDbUtil.getPropertiesKey("DataDownload"); //文件名称 String fileName = upfile.getOriginalFilename(); //文件路径 String path = prePath + baseUrl; //存入虚拟目录后的文件名 //存入虚拟目录后的文件 File uploadedFile = new File(path, fileName); File dest = uploadedFile.getParentFile(); //如果不存在目录就创建 if (!dest.exists()) { dest.mkdirs(); } //文件大小限制 long size = uploadedFile.length() / 1024 / 1024; if (size >= 10) { return JsonResponseExt.customFail("0032","上传文件的大小不能大于10Mb"); } try { //上传 upfile.transferTo(uploadedFile); //保存附件 AwardsAttachment attachment = new AwardsAttachment(); attachment.setFilePath(uploadedFile.getPath()); if (!"".equals(type)) { attachment.setAttachmentType(type); } attachment.setFileName(fileName); attachment.setCreateTime(new Date()); attachment.setDelflag("0"); Long id = awardsAttachmentService.addAttachment(attachment).getAttachmentId(); //定义返回信息 String origin = host + "/data/down/" + id; map.put("id", id + ""); map.put("name", fileName); map.put("filePath", uploadedFile.getPath()); map.put("url", origin); return JsonResponseExt.success(map); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return JsonResponseExt.customFail("0909","上传失败!"); } @GetMapping(value = "/down/{id}") public Object demo(@PathVariable("id") String id, String path, HttpServletRequest request, HttpServletResponse response) { if (!"".equals(id)) { AwardsAttachment tbAttachment = new AwardsAttachment(); tbAttachment.setAttachmentId(Long.parseLong(id)); AwardsAttachment awardsAttachment = awardsAttachmentService.findByAttachment(tbAttachment); try { // 下载本地文件 String fileName = awardsAttachment.getFileName(); // 读到流中 InputStream inStream = new FileInputStream(awardsAttachment.getFilePath()); // 设置输出的格式 response.reset(); //第一步:设置响应类型 response.setContentType("application/force-download"); response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); // 循环取出流中的数据 byte[] b = new byte[100]; int len; while ((len = inStream.read(b)) > 0) { response.getOutputStream().write(b, 0, len); } inStream.close(); } catch (IOException e) { e.printStackTrace(); } } return JsonResponseExt.customFail("0033","error"); } /** * 文件信息 * @param attachmentInfo * @param response * @return */ @GetMapping(value = "/downFile") public JsonResponseExt fileDownload(AwardsAttachment attachmentInfo, HttpServletResponse response,HttpServletRequest request) { Map<String, String> map = new HashMap<String,String>(); String host = request.getScheme()+"://"+request.getServerName() +":"+request.getLocalPort(); AwardsAttachment info = awardsAttachmentService.findByAttachment(attachmentInfo); String origin =host+"/data/down/" + info.getAttachmentId(); String fileName = info.getFileName(); map.put("url",origin); map.put("name",fileName); map.put("path",info.getFilePath()); return JsonResponseExt.success(map); } }
页面
<span class="info-item-status approval" @click="downFile(associatedMsg.creditCodeSample)"><i class="el-icon-tickets"></i></span>
//文件下载 downFile(url){ var elemIF = document.createElement("iframe"); elemIF.src = url; elemIF.style.display = "none"; document.body.appendChild(elemIF); },
associatedMsg.creditCodeSample为文件路径,类似下面那种路径(路径加上文件id)。为什么用这种路径呢?其实是我的项目是前端和后端是分离的,所以前端的端口和后端的端口号是不一致的,同时如果是
直接根据文件id去访问那个下载接口,我发现是返回的是文件流,并不会自动弹出下载框进行下载。如果是文件流的形式还要弄成Blob类型,而且文件名无法确定,如果要有文件的名称的话
好像还要发一个请求去获取文件的信息。如果存的是下面的链接地址形式,直接点击就会请求这个接口进行下载了。
文件流形式
let url = window.URL.createObjectURL(new Blob([文件流])) let a= document.createElement('a'); a.style.display = 'none'; a.href = url; a.setAttribute('download', 文件名称及后缀); document.body.appendChild(a) a.click();
如果你其他的实体类存的是文件的id,可以根据文件id 获取文件信息再下载。[
this.$sysApi.fileMsg() ,这个其实就是一个get方法
]
download(row) { this.$sysApi.fileMsg({"attachmentId":row.fileId}).then(res =>{ console.log(res,"文件"); var elemIF = document.createElement("iframe"); elemIF.src = res.data.url; elemIF.style.display = "none"; document.body.appendChild(elemIF); }); }
原文链接:https://www.cnblogs.com/xiluonanfeng/p/10402653.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash