springMVC 文件上傳

相關依賴

使用 springMVC 提供的文件上傳須要在項目中加入兩個 jar 包,對應的 maven 的依賴分別是:commons-io 和 commons-fileuploadhtml

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

springMVC 配置文件

springMVC 的配置文件須要注入 sprigMVC 支持文件上傳的類 CommonsMultipartResolver 的bean,bean 的 id 爲multipartResolver,該 id 是固定的,springMVC 在加載時會去容器查找該 id 的bean,若容器中存在該 id,則支持文件上傳,若不存在,則不支持文件上傳前端


前端異步請求文件上傳

//html代碼
圖片上傳:<input type="file" name="file1" multiple="multiple" id="file0" />
<img src="" id="img0">
<button id="ajax_upload">Ajax上傳</button>

//js 代碼
$("#file0").change(function () {
            var formData = new FormData();
            formData.append("file",document.getElementById("file0").files[0]);
            $.ajax({
                url : "ajaxUpload",
                data : formData,
                type : "post",
                contentType:false,
                processData:false,
                dataType : "json",
                success : function(response){
                    if(response.dataState == "success"){
                        // 爲 src 屬性設置上傳文件的相對路徑,實現文件預覽
                        $("#img0").attr("src",response.responseMap["fileUrl"]);
                    }else{
                        alert(response.dataState);
                    }
                }
            });
        });

注:ajax 發起文件上傳的請求時須要將 contentType 和 processType 都設置爲 falseajax


後臺 controller 實現

使用 springMvc 實現文件上傳時,congtroller 須要指定 MultipartFile 類型的參數來接收前端傳來的文件數據spring

@RequestMapping(value = "ajaxUpload",produces = {"text/html;charset=UTF-8;","application/json;"})
    @ResponseBody
    public ResponseResult ajaxUplod(ResponseResult responseResult, MultipartFile file, HttpServletRequest request){
        // 獲取上傳文件的原始名稱
        String fileName = file.getOriginalFilename();
        // 獲取上傳文件的後綴名
        String ext = fileName.substring(fileName.lastIndexOf("."));
        // 獲取當前項目資源文件的絕對路徑
        StringBuilder stringBuilder1 = new StringBuilder(request.getSession().getServletContext().getRealPath("/"));
        String baseUrl = stringBuilder1.toString();
        // 設置本地文件的相對路徑
        StringBuilder stringBuilder2 = new StringBuilder(File.separator);
        stringBuilder2.append("upload");
        stringBuilder2.append(File.separator);
        stringBuilder2.append(Calendar.YEAR);
        stringBuilder2.append("-");
        stringBuilder2.append(Calendar.MONTH);
        stringBuilder2.append("-");
        stringBuilder2.append(Calendar.DATE);
        stringBuilder2.append(ext);
        String fileUrl = stringBuilder2.toString();
        // 當前項目路徑 + 文件存儲的相對路徑 = 上傳文件存儲的絕對路徑
        File localFile = new File(stringBuilder1.append(stringBuilder2).toString());
        Map<String,Object> map = new HashMap();
        // 將文件的相對路徑返回給前端實現文件預覽
        map.put("fileUrl",fileUrl);
        if(!localFile.exists()){
            localFile.mkdirs();
        }
        try {
            file.transferTo(localFile);
            responseResult.setDataState("success");
            responseResult.setMsg("上傳成功");
            responseResult.setResponseMap(map);
        } catch (IOException e) {
            responseResult.setDataState("fail");
            responseResult.setMsg("上傳失敗");
            e.printStackTrace();
        }
        return responseResult;
    }

注:json

  1. 若上傳的文件只需保存在當前項目的目錄中,可使用上述方法,若需保存在單獨的圖片服務器中,則須要指定服務器的訪問路徑,該路徑最好是寫在配置文件中
  2. 單獨將相對路徑提取出來返回給前端是爲了前端能預覽上傳的文件,若沒有這種需求,能夠忽略此步驟
  3. transferTo 方法是 springMVC 提供的複製文件的方法,該方法將file 文件的內容寫入到指定的文件中去,省略來手動進行文件複製的流操做
相關文章
相關標籤/搜索