【SpringBoot】三十九、SpringBoot上傳文件至項目resources目錄下


此文轉載自:https://blog.csdn.net/qq_40065776/article/details/110054720

當我們沒有搭建單獨的文件服務器時,我們需要將文件上傳至項目目錄下,今天我們就學習如何上傳文件到項目的resources目錄下

一、引入依賴

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

文件上傳,就會涉及到 IO 操作,我們需要引入以上依賴

二、配置文件

spring:
  # 上傳文件
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

配置上傳文件的最大值:

  • spring.servlet.multipart.max-file-size,限制單個文件的最大值
  • spring.servlet.multipart.max-request-size,限制上傳的多個文件的總大小

三、上傳工具類

package com.asurplus.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.net.InetAddress;
import java.util.UUID;

/** * 文件上傳 * * @author YangXiuTeng * @date Jun 1, 2015 */
@Component
public class UploadFileUtil {

	/** * 項目端口 */
    @Value("${server.port}")
    public String port;

	/** * 項目路徑 */
    @Value("${server.servlet.context-path}")
    public String contextPath;

	/** * 上傳文件 * * @param multipartFile 文件對象 * @param dir 上傳目錄 * @return */
    public ResponseResult uploadFile(MultipartFile multipartFile, String dir) {
        try {
            if (multipartFile.isEmpty()) {
                return ResponseResult.error("請選擇文件");
            }
            // 獲取文件的名稱
            String originalFilename = multipartFile.getOriginalFilename();
            // 文件后綴 例如:.png
            String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // uuid 生成文件名
            String uuid = String.valueOf(UUID.randomUUID());
            // 根路徑,在 resources/static/upload
            String basePath = ResourceUtils.getURL("classpath:").getPath() + "static/upload/" + (StringUtils.isNotBlank(dir) ? (dir + "/") : "");
            // 新的文件名,使用uuid生成文件名
            String fileName = uuid + fileSuffix;
            // 創建新的文件
            File fileExist = new File(basePath);
            // 文件夾不存在,則新建
            if (!fileExist.exists()) {
                fileExist.mkdirs();
            }
            // 獲取文件對象
            File file = new File(basePath, fileName);
            // 完成文件的上傳
            multipartFile.transferTo(file);
            // 返回絕對路徑
            return ResponseResult.success("上傳成功", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + contextPath + "/upload/" + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseResult.error("上傳失敗");
    }
}

  • 我們由於需要在工具類中獲取項目端口及上下文路徑,所以我們使用注解 @Component
  • 我們上傳的根目錄在:resources/static/upload
  • 文件名,我們使用了 uuid 作為新的文件名,保證文件不會被覆蓋
  • 我們返回的路徑是絕對路徑,在實際的生成環境中,建議使用相對路徑
  • ResponseResult 是我們自定義的統一返回對象,表示成功還是失敗

四、上傳調用

  • 1、注入上傳工具類
@Autowired
private UploadFileUtil uploadFileUtil;
  • 2、上傳 API
/** * 上傳文件 * <p> * Ajax方式上傳文件 * * @return */
@PostMapping("uploadFileAjax")
@ResponseBody
public ResponseResult uploadFileAjax(HttpServletRequest request) {
    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
    MultipartFile file = multiRequest.getFile("files");
    String dir = request.getHeader("Minio-dir");
    return uploadFileUtil.uploadFile(file, dir);
}
  • 3、上傳調用

Html

<p>ajax提交</p>
<hr>
<div style="height: 200px;width: 200px;position: relative;border: 1px #e2e2e2 solid">
    <input type="file" accept="image/*" id="imgUpload" style="position: absolute;left: 0;top: 0;opacity: 0;filter: alpha(opacity=0);height: 100%;width: 100%;z-index: 99">
    <img src="" alt="" id="picImg" style="height: 100%;width: 100%;position: absolute;left: 0;top: 0;">
</div>

JavaScript

$('#imgUpload').change(function () {
    var formData = new FormData();
    formData.append("files", $("#imgUpload")[0].files[0]);
    var index = layer.load();
    $.ajax({
        type : "POST",
        cache: false,
        dataType: "json",
        data : formData,
        processData :  false,
        contentType :  false,
        url: baseUrl + 'uploadFileAjax',
        success:function(res){
            layer.close(index);
            layer.msg(res.msg);
            if(200 == res.code){
                $('#picImg').attr('src',res.data);
            }
        },
        error:function() {
            layer.close(index);
            layer.msg("服務器異常!");
        }
    });
});

五、上傳測試

上傳元素
點擊上傳

上傳成功
圖片上傳成功,轉到上傳目錄:

上傳目錄
成功上傳至項目的 resources/static/upload/ 目錄下

如您在閱讀中發現不足,歡迎留言!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM