Java實現文件上傳和下載的方法詳解
1、文件上傳
1.1 介紹
文件上傳,也稱為upload,是指將本地圖片、視頻、音頻等文件上傳到服務器上,可以供其他用戶瀏覽或下載的過程。文件上傳在項目中應用非常廣泛,我們經常發(fā)微博、發(fā)微信朋友圈都用到了文件上傳功能。
文件上傳時,對頁面的form表單有如下要求:
| 表單屬性 | 取值 | 說明 |
|---|---|---|
| method | post | 必須選擇post方式提交 |
| enctype | multipart/form-data | 采用multipart格式上傳文件 |
| type | file | 使用input的file控件上傳 |
舉例:
<form method="post" action="/common/upload" enctype="multipart/form-data"> <input name="myFile" type="file" /> <input type="submit" value="提交" /> </form>
目前一些前端組件庫也提供了相應的上傳組件,例如Element-ui,但是底層原理還是基于form表單的文件上傳。

1.2 代碼實現
這里我主要實現后端代碼,對于前端頁面,可以使用ElementUI提供的上傳組件。
1、application.yml
首先我們需要在yml 文件里 配置一下文件存儲路徑。

2、Controller
然后我們就可以編寫上傳文件的Controller。
編寫文件上傳的方法, 通過MultipartFile類型的參數即可接收上傳的文件, 方法形參的名稱需要與頁面的file域的name屬性一致。
package com.jie.reggjie.controller;
import com.jie.reggjie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
* 文件上傳和下載
*/
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
@Value("${reggie.path}")
private String basePath;
/**
* 文件上傳
*
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file) {
return null;
}
} 實現步驟:
1、獲取文件的原始文件名, 通過原始文件名獲取文件后綴。

2、我們可以通過UUID重新聲明文件名, 避免文件名稱重復造成文件覆蓋。

3、創(chuàng)建文件存放目錄,防止目錄不存在導致文件上傳失敗。

4、將上傳的臨時文件轉存到指定位置。
注:
因為我們點擊上傳其實是將文件臨時保存到我們計算機的一個臨時文件夾內,如果我們不將其轉存,本次請求結束后,文件也會自動刪除。
最后將文件名返回,我這里需要將文件名存到數據庫內。
完整代碼:
/**
* @description: 文件上傳
* @author: Jie
* @date: 2022/8/15 10:16
* @param: [file] 文件
* @return: 文件名
**/
@PostMapping("/upload")
public R<String> upload(MultipartFile file) {
// 1、獲取文件的原始文件名, 通過原始文件名獲取文件后綴 例如:abc.jpg
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 2、使用UUID重新生成文件名,防止文件名稱重復造成文件覆蓋
String fileName = UUID.randomUUID().toString() + suffix;
// 3、創(chuàng)建一個目錄對象
File dir = new File(basePath);
//判斷當前目錄是否存在
if (!dir.exists()) {
//目錄不存在,需要創(chuàng)建
dir.mkdirs();
}
try {
// 4、將臨時文件轉存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}2、下載
2.1 介紹
文件下載,也稱為download,是指將文件從服務器傳輸到本地計算機的過程。
通過瀏覽器進行文件下載,通常有兩種表現形式:
1、 以附件形式下載,彈出保存對話框,將文件保存到指定磁盤目錄

2、直接在瀏覽器中打開
而我要實現的就是在瀏覽器中直接打開。

文件下載,前端頁面可以使用<img>標簽展示下載的圖片。
<img v-if="imageUrl" :src="imageUrl" class="avatar"></img>
那么,通過<img>標簽如何展示圖片數據呢,我們來看一下具體的流程:

在文件上傳成功后,在 handleAvatarSuccess 方法中獲取文件上傳成功之后返回的數據(文件名),然后調用 /common/download?name=xxx 進行文件的下載。
在這里,我們想讓上傳的照片能夠在頁面展示出來,所以我們就需要在服務端將文件以流的形式寫回瀏覽器。
2.2 代碼實現
在 Controller 中定義方法download,并接收頁面?zhèn)鬟f的參數name,然后讀取圖片文件的數據,然后以流的形式寫回瀏覽器。
/**
* @description: 文件下載
* @author: Jie
* @date: 2022/8/15 10:46
**/
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
}實現步驟:
1、定義輸入流,通過輸入流讀取文件內容。

2、通過response對象,獲取到輸出流。

3、通過response對象設置響應數據格式(image/jpeg)。

4、 通過輸入流讀取文件數據,然后通過上述的輸出流寫回瀏覽器。

5、 關閉資源

完整代碼:
/**
* @description: 文件下載
* @author: Jie
* @date: 2022/8/15 10:46
**/
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
// 1、定義輸入流,通過輸入流讀取文件內容
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
// 2、通過response對象,獲取到輸出流
ServletOutputStream outputStream = response.getOutputStream();
// 3、通過response對象設置響應數據格式(image/jpeg)
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
// 4、通過輸入流讀取文件數據,然后通過上述的輸出流寫回瀏覽器
outputStream.write(bytes,0,len);
// 刷新
outputStream.flush();
}
// 5、關閉資源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}到此這篇關于Java實現文件上傳和下載的方法詳解的文章就介紹到這了,更多相關Java文件上傳下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中的ImportSelector類動態(tài)加載bean詳解
這篇文章主要介紹了SpringBoot中的ImportSelector類動態(tài)加載bean詳解,ImportSelector接口是spring中導入外部配置的核心接口,根據給定的條件(通常是一個或多個注釋屬性)判定要導入那個配置類,在spring自動化配置和@EnableXXX中都有它的存在,需要的朋友可以參考下2024-01-01
MybatisPlus實現insertBatchSomeColumn進行批量增加
本文主要介紹了MybatisPlus實現insertBatchSomeColumn進行批量增加,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03

