Java實(shí)現(xiàn)文件上傳與文件下載的示例代碼
文件上傳與文件下載
在開發(fā)中項(xiàng)目難免會(huì)遇到文件上傳和下載的情況,如果公司有部署文件服務(wù)器是再好不過啦,直接調(diào)用文件服務(wù)器上傳和下載的接口,保留返回的文件id即可。
但是如果公司沒有文件服務(wù)器就比較苦逼了,得手寫文件上傳和下載的接口把文件存儲(chǔ)在服務(wù)器的某個(gè)位置,以便使用。
直接把代碼貼出來以供記錄筆記。
先controller層
@ApiOperation(value = "文件上傳", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping("/file/upload") @Transactional(rollbackFor = Exception.class) public ApiResult<String> upload(@RequestPart("file") MultipartFile file) { try { TFileUploadDet fileUpload = FileManageUtil.upload(file); return ApiResult.data(fileUpload.getId()); } catch (Exception e) { log.error(e.getMessage(),e); return ApiResult.fail(e.getMessage()); } }
然后服務(wù)層
public static TFileUploadDet upload(MultipartFile file) { Assert.notNull(file, "文件不能為空"); //獲取上傳文件名稱 String originalFilename = file.getOriginalFilename(); //獲取文件后綴名 String suffix = originalFilename.substring(originalFilename.lastIndexOf('.')); String extName = suffix.substring(1); //校驗(yàn)文件格式是否為規(guī)定 Assert.isTrue(WjlxEnum.WJLX999.getExtNameList().contains(extName),"文件類型僅支持jpg/mp4/pdf,請(qǐng)確認(rèn)!"); String id = SecureUtil.md5(originalFilename + IdUtil.getSnowflakeNextIdStr()); String fileName = id + suffix; String year = DateUtil.format(new Date(), "yyyy"); String today = DateUtil.format(new Date(), "yyyy-MM-dd"); //獲取文件存儲(chǔ)路徑 String fileId = File.separator + year + File.separator + today + File.separator + fileName; Path path = Paths.get(filePath(fileId)); //創(chuàng)建文件夾(存在文件夾就直接存在該文件夾下沒有文件夾就先創(chuàng)建文件夾在保存) FileUtil.mkParentDirs(path); InputStream inputStream = null; OutputStream outputStream = null; //文件流上傳文件 try { inputStream = file.getInputStream(); outputStream = Files.newOutputStream(path); IoUtil.copy(inputStream, outputStream); //一下為自定義返回參數(shù),視情況而定 TFileUploadDet fileUpload = new TFileUploadDet(); fileUpload.setId(id); fileUpload.setWjmc(originalFilename); fileUpload.setWjlj(path.toString()); fileUpload.setCreateTime(new Date()); return fileUpload; } catch (IOException e) { throw new RuntimeException("文件上傳失敗", e); } finally { IoUtil.close(outputStream); IoUtil.close(inputStream); } } /** * 獲取完整的文件路徑 * * @param fileId 文件唯一標(biāo)識(shí) * @return 文件路徑 */ public static String filePath(String fileId) { return uploadFilePath + fileId; }
注:需要注意的是 獲取完整文件路徑方法中的 uploadFilePath :是文件將要保存在服務(wù)器中的位置路徑,可以在配置文件中配置好后引用。最后把返回的信息存在在表中使用。整個(gè)文件上傳就完成了。其中用到了hutool的第三方包我使用的版本為5.8.6
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.8.6</version> </dependency>
文件下載
這個(gè)就沒有什么好說的了,比較簡單,就是流的操作而已。傳入的參數(shù)為文件上傳是保存的文件的id即可。
@ApiOperation(value = "通過文件id下載文件") @PostMapping("/downloadById") public void downloadFileById(HttpServletRequest request, HttpServletResponse response, @RequestBody @Valid IdDTO idDTO) { String id = idDTO.getId(); Assert.isTrue(StringUtils.isNotEmpty(id), "主表id不能為空"); TFile tFile = fileService.getById(id); Assert.notNull(tFile, "要下載的文件不存在"); String fileName = tFile.getFileName(); request.getSession(); //獲取頁面輸出流 try (ServletOutputStream out = response.getOutputStream()) { String path = tFile.getFileLink(); File file = new File(path); byte[] bytes = FileUtils.readFileToByteArray(file); // 設(shè)置響應(yīng)頭 response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); out.write(bytes); out.flush(); } catch (IOException e) { log.error(e.getMessage()); throw new RuntimeException("下載文件出錯(cuò)"); } }
到此這篇關(guān)于Java實(shí)現(xiàn)文件上傳與文件下載的示例代碼的文章就介紹到這了,更多相關(guān)Java文件上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在MyBatis中實(shí)現(xiàn)DataSource
今天給大家整理了如何在MyBatis中實(shí)現(xiàn)DataSource,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06springboot中redis的緩存穿透問題實(shí)現(xiàn)
這篇文章主要介紹了springboot中redis的緩存穿透問題實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Mybatis參數(shù)(Parameters)傳遞方式
這篇文章主要介紹了Mybatis參數(shù)(Parameters)傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12