SpringBoot文件上傳到伺服器

一、SpringBoot上傳文件到資料庫

文件上傳到資料庫是一個常見的需求,可以用於保存用戶上傳的圖片等二進位文件。在SpringBoot中,使用Spring提供的Hibernate框架,配合Spring的JdbcTemplate實現文件上傳到資料庫。

首先,需要定義資料庫表來存儲上傳的文件信息,包括文件ID,文件名,文件類型,文件大小和文件內容等欄位。創建對應的Java類,並添加註解來映射資料庫表和欄位:

@Entity
@Table(name = "t_file")
public class File {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  //文件ID
 
    @Column(name = "file_name")
    private String fileName;  //文件名
 
    @Column(name = "file_type")
    private String fileType;  //文件類型
 
    @Column(name = "file_size")
    private Long fileSize;  //文件大小
 
    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "file_content")
    private byte[] fileContent;  //文件內容
 
    //省略get/set方法
}

接下來,編寫控制器來實現文件上傳到資料庫。使用Spring的MultipartFile介面來處理上傳的文件,通過JdbcTemplate來將文件信息存儲到資料庫。代碼如下:

@RestController
@RequestMapping("/file")
public class FileController {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        String fileType = file.getContentType();
        Long fileSize = file.getSize();
        byte[] fileContent = file.getBytes();
 
        String sql = "INSERT INTO t_file (file_name, file_type, file_size, file_content) VALUES (?, ?, ?, ?)";
        jdbcTemplate.update(sql, fileName, fileType, fileSize, fileContent);
        return "file uploaded successfully";
    }
}

在瀏覽器中訪問http://localhost:8080/file/upload,上傳文件即可保存到資料庫中。這樣就實現了上傳文件到資料庫的功能。

二、SpringBoot上傳文件和參數

在實際開發中,文件上傳往往需要與其他表單數據一起提交,比如上傳用戶頭像時,還需要同時提交用戶名和密碼等信息。SpringBoot也支持同時上傳文件和參數。

可以使用@RequestParam註解來獲取上傳的文件和表單參數,示例代碼如下:

@PostMapping("/uploadWithParam")
public String uploadWithParam(@RequestParam("file") MultipartFile file, @RequestParam("username") String username, @RequestParam("password") String password) throws IOException {
    String fileName = file.getOriginalFilename();
    String fileType = file.getContentType();
    Long fileSize = file.getSize();
    byte[] fileContent = file.getBytes();
 
    //保存文件到資料庫或伺服器
    //省略代碼
 
    return "file uploaded successfully with user "+username+" and password "+password;
}

在瀏覽器中訪問http://localhost:8080/file/uploadWithParam,同時上傳文件和參數即可。

三、SpringBoot多線程上傳文件

當上傳的文件較大時,可能需要較長時間才能完成上傳。為了提高上傳效率,可以使用多線程技術來實現文件的分塊上傳。SpringBoot也支持多線程上傳文件。

可以使用Java的Executor框架來創建線程池,將文件分塊後,將每一塊交給線程池中的線程處理。當所有線程都執行完畢後,將文件塊合併成完整的文件。示例代碼如下:

@PostMapping("/uploadMultiThread")
public String uploadMultiThread(@RequestParam("file") MultipartFile file) throws IOException, ExecutionException, InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(3);
 
    String fileName = file.getOriginalFilename();
    String fileType = file.getContentType();
    Long fileSize = file.getSize();
    byte[] fileContent = file.getBytes();
 
    int chunkSize = 1024*1024; //每個線程上傳1MB的數據
    int numChunks = (int)Math.ceil(fileSize/chunkSize); //計算要上傳的線程數
 
    List<Future> futures = new ArrayList();
 
    for (int i = 0; i < numChunks; i++) {
        int startIndex = i*chunkSize;
        int endIndex = Math.min(startIndex+chunkSize, (int)fileSize);
        byte[] subFileContent = Arrays.copyOfRange(fileContent, startIndex, endIndex);
        futures.add(executor.submit(new FileUploadTask(i, subFileContent)));
    }
 
    List results = new ArrayList();
    for (Future future : futures) {
        results.add(future.get());
    }
 
    executor.shutdown();
 
    //將所有分塊合併為完整的文件,並保存到資料庫或伺服器
    //省略代碼
 
    return "file uploaded successfully with multi-threading";
}
 
private class FileUploadTask implements Callable {
    private int index;
    private byte[] fileContent;
 
    public FileUploadTask(int index, byte[] fileContent) {
        this.index = index;
        this.fileContent = fileContent;
    }
 
    @Override
    public String call() throws Exception {
        //上傳分塊文件
        //省略代碼
        return "chunk "+index+" uploaded successfully";
    }
}

在瀏覽器中訪問http://localhost:8080/file/uploadMultiThread,啟動多線程上傳文件。

四、SpringBoot上傳文件到指定文件夾

有時候,需要將上傳的文件保存到指定的文件夾中。SpringBoot提供了文件系統相關的API來實現上傳文件到指定文件夾。

可以使用Spring的Resource介面以及Java的File類來指定存儲文件的文件夾。示例代碼如下:

@RestController
@RequestMapping("/file")
public class FileController {
 
    @Value("${upload.path}") //從配置文件中讀取文件夾路徑
    private String uploadPath;
 
    @PostMapping("/uploadToFile")
    public String uploadToFile(@RequestParam("file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        String fileType = file.getContentType();
        Long fileSize = file.getSize();
        byte[] fileContent = file.getBytes();
 
        File folder = new File(uploadPath);
        if (!folder.exists()) {
            folder.mkdirs(); //如果文件夾不存在,則創建文件夾
        }
 
        Path filePath = Paths.get(uploadPath, fileName);
        Files.write(filePath, fileContent);
 
        return "file uploaded successfully to "+uploadPath;
    }
 
}

在配置文件application.yml中添加文件夾路徑:

upload:
  path: /tmp/upload

在瀏覽器中訪問http://localhost:8080/file/uploadToFile,上傳的文件即可保存到指定文件夾中。

五、SpringBoot非同步上傳文件

非同步上傳文件可以提高網站的性能和響應速度,由於上傳操作會耗費一定時間,非同步上傳可以讓伺服器在上傳過程中處理其他請求,提升系統的並發處理能力。SpringBoot提供了非同步上傳文件的API。

可以使用Spring的@Async註解來將上傳文件的方法標記為非同步執行。示例代碼如下:

@RestController
@RequestMapping("/file")
public class FileController {
 
    @Autowired
    private AsyncFileUploader asyncFileUploader;
 
    @PostMapping("/uploadAsync")
    public String uploadAsync(@RequestParam("file") MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String fileType = file.getContentType();
        Long fileSize = file.getSize();
        byte[] fileContent = null;
        try {
            fileContent = file.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        asyncFileUploader.upload(fileName, fileType, fileSize, fileContent);
 
        return "file uploaded asynchronously";
    }
 
}
 
@Service
public class AsyncFileUploader {
 
    @Async
    public void upload(String fileName, String fileType, Long fileSize, byte[] fileContent) {
        //上傳文件
        //省略代碼
    }
 
}

在瀏覽器中訪問http://localhost:8080/file/uploadAsync,上傳文件即可非同步上傳。

六、SpringBoot上傳文件和圖片

上傳圖片是網站開發中的一個常見需求,SpringBoot也支持上傳圖片。可以通過修改前面的上傳文件的代碼,在上傳文件時添加圖片壓縮等處理邏輯,實現上傳圖片的功能。

例如,可以使用Java的ImageIO類來將上傳的圖片進行壓縮和縮放,代碼如下:

@PostMapping("/uploadImage")
public String uploadImage(@RequestParam("image") MultipartFile image) throws IOException {
    String imageName = image.getOriginalFilename();
    String imageType = image.getContentType();
    Long imageSize = image.getSize();
    byte[] imageContent = image.getBytes();
 
    //壓縮和縮放圖片
    BufferedImage bufferedImage = ImageIO.read(image.getInputStream());
    int width = bufferedImage.getWidth();
    int height = bufferedImage.getHeight();
    if (width > 1024 || height > 1024) {
        float scale = Math.min(1024f/width, 1024f/height);
        width = (int)(width*scale);
        height = (int)(height*scale);
    }
    Image scaledImage = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = resizedImage.createGraphics();
    g2d.drawImage(scaledImage, 0, 0, null);
    g2d.dispose();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ImageIO.write(resizedImage, "JPEG", outputStream);
    imageContent = outputStream.toByteArray();
 
    //保存圖片到資料庫或伺服器
    //省略代碼
 
    return "image uploaded successfully";
}

在瀏覽器中訪問http://localhost:8080/file/uploadImage,上傳圖片即可實現上傳圖片的功能。

七、SpringBoot批量上傳文件

有時候,需要同時上傳多個文件,SpringBoot也支持批量上傳文件。可以使用Spring的MultipartHttpServletRequest類來獲取所有上傳的文件,然後逐個保存到資料庫或伺服器。示例代碼如下:

@PostMapping("/uploadBatch")
public String uploadBatch(HttpServletRequest request) throws IOException {
    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
    Iterator iterator = multiRequest.getFileNames();
    while (iterator.hasNext()) {
        MultipartFile file = multiRequest.getFile(iterator.next());
        String fileName = file.getOriginalFilename();
        String fileType = file.getContentType();
        Long fileSize = file.getSize();
        byte[] fileContent = file.getBytes();
 
        //保存文件到資料庫或伺服器
        //省略代碼
    }
 
    return "batch uploaded successfully";
}

在瀏覽器中訪問http://localhost:8080/file/uploadBatch,同時上傳多個文件即可實現批量上傳文件的功能。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151319.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-11 13:41
下一篇 2024-11-11 13:41

相關推薦

  • 伺服器安裝Python的完整指南

    本文將為您提供伺服器安裝Python的完整指南。無論您是一位新手還是經驗豐富的開發者,您都可以通過本文輕鬆地完成Python的安裝過程。以下是本文的具體內容: 一、下載Python…

    編程 2025-04-29
  • STUN 伺服器

    STUN 伺服器是一個網路伺服器,可以協助網路設備(例如 VoIP 設備)解決 NAT 穿透、防火牆等問題,使得設備可以正常地進行數據傳輸。本文將從多個方面對 STUN 伺服器做詳…

    編程 2025-04-29
  • 從ga角度解讀springboot

    springboot作為目前廣受歡迎的Java開發框架,其中的ga機制在整個開發過程中起著至關重要的作用。 一、ga是什麼 ga即Group Artifacts的縮寫,它是Mave…

    編程 2025-04-29
  • 解決docker-compose 容器時間和伺服器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與伺服器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • 使用 DRF 實現文件上傳

    文件上傳是 web 應用程序中最常見的需求之一,本文將介紹如何使用 Django Rest Framework (DRF) 來實現文件上傳。通過本文,你將學習到如何使用 DRF 中…

    編程 2025-04-28
  • 如何選擇MySQL伺服器文件許可權

    MySQL是一種流行的關係型資料庫管理系統。在安裝MySQL時,選擇正確的文件許可權是保證安全和性能的重要步驟。以下是一些指導您選擇正確許可權的建議。 一、許可權選擇 MySQL伺服器需…

    編程 2025-04-27
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • 如何將Python代碼部署到伺服器

    Python是一種高級編程語言,常被用於數據分析、機器學習、Web開發等不同領域的工作。但是,只有將Python代碼部署到伺服器上,才能讓其真正發揮作用。 一、選擇伺服器 要將Py…

    編程 2025-04-27
  • Python伺服器客戶端

    本文將從以下幾個方面對Python伺服器客戶端進行詳細闡述:socket編程、HTTP協議、Web框架、非同步IO。 一、socket編程 Python的socket模塊是為網路編程…

    編程 2025-04-27
  • 如何解決很少人使用台灣伺服器的問題

    很少人使用台灣伺服器,這是一個比較普遍的問題,但並不難解決。本文將從多個方面進行詳細闡述。 一、認識台灣伺服器 台灣伺服器是指位於台灣地區的伺服器,它與大陸伺服器有一定區別。在台灣…

    編程 2025-04-27

發表回復

登錄後才能評論