jQuery 中 ajax 使用 FormData 上傳多個Base64或文件(File)【更新】


1. base64(字符串)作為數據源(在前端生成的文件而非選擇的文件)。

前端調用上傳接口示例

// 圖片分組上傳,images,subjectTypeImages 為圖片轉的base64數組,titles是字符串數組。
var formData = new FormData();
images.forEach(function (image) {
    formData.append("picture[]", image);
});
subjectTypeImages.forEach(function (image) {
    formData.append("subjectTypeImages[]", image);
});
subjectStatusImages.forEach(function (image) {
    formData.append("subjectStatusImages[]", image);
});
titles.forEach(function (image) {
    formData.append("titles[]", image);
});
// 而外的參數數據
formData.append("titleKey", titleKey);
formData.append("searchType", searchType);

$.ajax({
    url:'upload.do',
    method:'POST',
    data:formData,
    // 默認為true,設為false后直到ajax請求結束(調完回掉函數)后才會執行$.ajax(...)后面的代碼
    async: false, 
    // 下面三個,因為直接使用FormData作為數據,contentType會自動設置,也不需要jquery做進一步的數據處理(序列化)。
    cache: false,
    contentType: false,
    processData: false,
    success:function(data){
        console.log(data);
    },
    error:function(error){
        console.log(error.message);
    }
});

java(springMVC) 后端接收示例

@ResponseBody
@RequestMapping(value = "upload.do", method = RequestMethod.POST)
public Object upload(HttpServletRequest request) throws Exception {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());

    // 先判斷request中是否包涵multipart類型的數據,
    if (multipartResolver.isMultipart(request)) {
        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
        String[] picture = multiRequest.getParameterValues("picture[]");
        String[] subjectTypeImages = multiRequest.getParameterValues("subjectTypeImages[]");
        String[] subjectStatusImages = multiRequest.getParameterValues("subjectStatusImages[]");
        String[] titles = multiRequest.getParameterValues("titles[]");
        String searchType = multiRequest.getParameter("searchType");
        String titleKey = multiRequest.getParameter("titleKey");
        
        // todo: any-thing
    }
    return "success";
}

2. form 表單中使用input 選擇文件上傳, File類型

form 表單

<form id="form111" enctype="multipart/form-data" method="post" action="#">
    <input type="file" name="files">
    <input type="file" name="files">
    <input type="file" name="files">
    <!-- 這個可以選擇多個文件,而且只可以選圖片 -->
    <input type="file" name="files" accept="image/*" multiple>
    <input type="text" name="username">
    <input type="button" id="btn">
</form>

javascript 上傳接口調用示例

$("#btn").click(function () {
    // 獲取所有文件
    // 1. 使用直接使用form表單獲取,會獲取所有input值
        var fomdata = new FormData(document.getElementById("form111"));
    // 2. 只獲取文件
        var fomdata = new FormData();
        $("#form111").children("input[name='files']").each(function (index, input) {
            for(var i=0; i<input.files.length; i++) {
                fomdata.append("files", input.files[i]);
            }
        });
    $.ajax({
        method:'POST',
        data:formData,
        url:'upload.do',
        // async: false, // 同步上傳,默認(true)異步
        cache: false,
        contentType: false,
        processData: false,
        success:function(data){
            console.log(data);
        },
        error:function(){
            console.log('上傳失敗');
        }
    });
});

java(springMVC) 后端代碼示例

@ResponseBody
@RequestMapping(value = "upload.do", method = RequestMethod.POST)
public Object upload(MultipartFile[] files/* files 為input的name,這樣就可以獲取所有文件的數組了。*/, String filename, HttpServletRequest request) throws Exception {
    // 遍歷數組保存文件,并把文件相對路徑存到數據庫。。。等。
    return "success";
}

推薦一個前端上傳組件

    @ResponseBody
    @RequestMapping(value = "upload.do", method = RequestMethod.POST)
    public Object uploadFile(MultipartFile file, String name1, HttpServletRequest request) throws Exception {
        UploadDto uploadDto = new UploadDto(); // 就是一個格式化返回信息的類。
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        // 先判斷request中是否包涵multipart類型的數據,
        if (multipartResolver.isMultipart(request)) {
            try {
                // 
                String fileId = service.saveFile(file);
                uploadDto.setMessage("上傳成功!");
                uploadDto.setCode(0);
                uploadDto.setFileId(fileId);
            } catch (Exception e) {
                e.printStackTrace();
                uploadDto.setMessage("上傳失敗!");
                uploadDto.setCode(-1);
            }
        }
        return uploadDto;
    }

總結

不同的上傳方式需要配合不同的接收方式。同一個項目盡量使用同一套規范進行封裝。這里使用ajax作為客戶端上傳,其它平臺遵循http協議的情況下可以使用同一個上傳接口。

參考

  1. 廖雪峰javascript教程
  2. Sending multipart/formdata with jQuery.ajax
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,237評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,908評論 18 139
  • 該文章屬于劉小壯原創,轉載請注明:劉小壯[http://www.lxweimin.com/u/2de707c93d...
    劉小壯閱讀 13,418評論 19 27
  • 最近銀行股漲勢不錯,在昨天(2017年7月26日), 大盤的走勢是這樣的: 而四大行的走勢是這樣的: 宇宙第一大行...
    止一量化養家閱讀 472評論 3 2
  • 屋外呼嘯著,起了風,滿園凋盡葉子的的果樹,都似乎縮著頸,在瑟瑟發抖。 王松一個人住了他家的果園里。他不愿意再住在家...
    空中的梨子閱讀 417評論 0 3