SpringBoot實現(xiàn)文件的上傳、下載和預覽功能
引言
在Spring Boot項目中實現(xiàn)文件的上傳、下載和預覽功能,可以通過使用Spring MVC的MultipartFile接口來處理文件上傳,并使用HttpServletResponse或Resource來實現(xiàn)文件下載和預覽。下面是如何實現(xiàn)這些功能的完整示例。
1. 引入依賴
確保在pom.xml中引入了Spring Boot的相關依賴。通常情況下,Spring Boot Starter Web已經包含了必要的依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>2. 創(chuàng)建文件上傳、下載和預覽的Controller
你可以創(chuàng)建一個FileController來處理文件的上傳、下載和預覽。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
@Controller
@RequestMapping("/files")
public class FileController {
// 文件保存路徑(可以通過配置文件進行配置)
@Value("${file.upload-dir}")
private String fileUploadDir;
// 文件上傳
@PostMapping("/upload")
@ResponseBody
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
// 獲取文件名并且保存文件
String fileName = file.getOriginalFilename();
Path targetLocation = Paths.get(fileUploadDir).resolve(fileName);
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
// 返回文件下載的URL
String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/files/download/")
.path(fileName)
.toUriString();
return "File uploaded successfully: " + fileDownloadUri;
}
// 文件下載
@GetMapping("/download/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws MalformedURLException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
}
// 文件預覽(主要針對圖片、PDF等可以直接在瀏覽器中顯示的文件)
@GetMapping("/preview/{fileName}")
public ResponseEntity<Resource> previewFile(@PathVariable String fileName) throws MalformedURLException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
String contentType = "application/octet-stream";
try {
contentType = Files.probeContentType(filePath);
} catch (IOException e) {
e.printStackTrace();
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.body(resource);
}
}3. 配置文件上傳目錄
在application.properties或application.yml中配置文件的上傳路徑:
file.upload-dir=C:/uploads
或者使用application.yml:
file: upload-dir: C:/uploads
你可以將路徑配置為你項目的目錄,也可以指定到服務器的某個位置。
4. 創(chuàng)建上傳目錄
確保在你的系統(tǒng)上已經創(chuàng)建了配置文件中指定的上傳目錄,比如C:/uploads。如果沒有創(chuàng)建,可以通過代碼在項目啟動時自動創(chuàng)建:
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Component
public class FileUploadDirectoryInitializer implements CommandLineRunner {
@Value("${file.upload-dir}")
private String fileUploadDir;
@Override
public void run(String... args) throws Exception {
Path uploadPath = Paths.get(fileUploadDir);
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
}
}5. 測試上傳、下載和預覽
5.1 文件上傳
你可以使用Postman、cURL或者前端頁面來測試文件上傳功能。上傳文件的URL為:
POST http://localhost:8080/files/upload
參數(shù)名稱為file。
5.2 文件下載
你可以通過以下URL下載文件:
GET http://localhost:8080/files/download/{fileName}
其中{fileName}是文件的名稱。
5.3 文件預覽
你可以通過以下URL預覽文件(如圖片或PDF):
GET http://localhost:8080/files/preview/{fileName}6. 處理大文件上傳
對于大文件上傳,Spring Boot默認的最大上傳文件大小可能不滿足需求,可以通過以下配置進行調整:
spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB
或者在application.yml中:
spring:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB7. 文件預覽類型支持
通常情況下,瀏覽器支持預覽的文件類型包括圖片(如jpeg、png)、PDF、文本文件等。如果文件類型不被瀏覽器支持,通??梢酝ㄟ^文件下載的方式處理。
8. 文件刪除功能(可選)
你也可以添加一個刪除文件的接口,來刪除已上傳的文件:
// 文件刪除
@DeleteMapping("/delete/{fileName}")
@ResponseBody
public String deleteFile(@PathVariable String fileName) throws IOException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Files.deleteIfExists(filePath);
return "File deleted successfully";
}以上就是SpringBoot實現(xiàn)文件的上傳、下載和預覽功能的詳細內容,更多關于SpringBoot文件上傳、下載和預覽的資料請關注腳本之家其它相關文章!
相關文章
java實現(xiàn)HmacSHA256算法進行加密方式
這篇文章主要介紹了java實現(xiàn)HmacSHA256算法進行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
Java中==與equals()及hashcode()三者之間的關系詳解
最近也是在讀Hollis的《深入理解Java核心技術》里面一節(jié)講到了equals()和hashcode()的關系,對于這個高頻面試點,咱們需要認真理清一下幾者之間的關系2022-10-10
SpringBoot整合Hashids實現(xiàn)數(shù)據(jù)ID加密隱藏的全過程
這篇文章主要為大家詳細介紹了SpringBoot整合Hashids實現(xiàn)數(shù)據(jù)ID加密隱藏的全過程,文中的示例代碼講解詳細,對大家的學習或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學習一下2024-01-01

