首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 多文件上傳實現:從前端到存儲完整方案

     編輯:Java 綜合教學

Spring MVC 多文件上傳實現:從前端到存儲完整方案

文件上傳是 Web 開發高頻需求。本文提供基於 Spring MVC 的多文件上傳完整實現,涵蓋控制器處理、文件重命名、路徑管理、數據庫記錄等核心邏輯。

核心控制器代碼

public ResponseItem uploadFile(MultipartHttpServletRequest request, 
                               FileItem fileItem, PageData pd) {
    ResponseItem responseItem = new ResponseItem();
    try {
        boolean isSuccess = false;
        MultiValueMap<String, MultipartFile> multiMap = request.getMultiFileMap();
        String relativePath = CreateDateDirUtil.create(Const.UPLOADPATH + "/upload");
        Set<String> keys = multiMap.keySet();
        isSuccess = true;
        
        if (isSuccess) {
            FileItem uploadfile = new FileItem();
            for (String key : keys) {
                List<MultipartFile> mutiFiles = multiMap.get(key);
                for (MultipartFile file : mutiFiles) {
                    String uuid = UuidUtil.get32UUID();
                    String suffix = file.getOriginalFilename()
                            .substring(file.getOriginalFilename().indexOf("."));
                    
                    uploadfile.setProc(fileItem.getProc());
                    uploadfile.setFileTempname(uuid + suffix);
                    uploadfile.setNames(fileItem.getNames());
                    uploadfile.setUserid(fileItem.getUserid());
                    
                    String fileName = URLDecoder.decode(file.getOriginalFilename());
                    uploadfile.setFilename(fileName);
                    uploadfile.setFilepath("upload/" + relativePath);
                    
                    String type = fileItem.getType();
                    if ("blfj".equals(type)) fileItem.setType("辦理附件");
                    else if ("jxfj".equals(type)) fileItem.setType("結項附件");
                    else if ("xcfj".equals(type)) fileItem.setType("巡查附件");
                    uploadfile.setType("辦理附件");
                    
                    uploadfile.setTime(new Date());
                    file.transferTo(new File(Const.UPLOADPATH + "/upload/" + relativePath, 
                            uuid + suffix));
                    
                    isSuccess = workflowDao.insertWorkflowUploadFile(uploadfile);
                }
            }
            
            if (isSuccess) {
                return responseItem.getSuccessInfo(isSuccess);
            } else {
                return responseItem.getFailureInfo("false");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return responseItem;
}

關鍵技術點解析

  1. MultipartHttpServletRequest:Spring 封裝的多部分請求,支持多文件獲取
  2. MultiValueMap:鍵值對集合,一個表單字段對應多個文件
  3. UUID 重命名:避免文件名衝突,保證存儲唯一性
  4. 日期目錄分層:CreateDateDirUtil 按日期創建子目錄,避免單目錄文件過多
  5. 業務類型映射:根據參數動態設置附件業務分類
  6. 數據庫記錄:上傳成功後持久化文件元信息

前端配合要點

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="files" multiple />
    <input type="hidden" name="type" value="blfj" />
    <input type="hidden" name="proc" value="${procId}" />
    <button type="submit">上傳</button>
</form>

最佳實踐建議

  • 限制文件大小與類型,防止惡意上傳
  • 使用獨立文件服務器或對象存儲(OSS)
  • 實現斷點續傳與大文件分片上傳
  • 添加病毒掃描與內容合規檢測
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved