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請求結束(調完回掉函數)后才會執(zhí)行$.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;
    }

總結

不同的上傳方式需要配合不同的接收方式侵歇。同一個項目盡量使用同一套規(guī)范進行封裝骂澄。這里使用ajax作為客戶端上傳,其它平臺遵循h(huán)ttp協(xié)議的情況下可以使用同一個上傳接口惕虑。

參考

  1. 廖雪峰javascript教程
  2. Sending multipart/formdata with jQuery.ajax
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末坟冲,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子溃蔫,更是在濱河造成了極大的恐慌健提,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酒唉,死亡現場離奇詭異矩桂,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門侄榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雹锣,“玉大人,你說我怎么就攤上這事癞蚕∪锞簦” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵桦山,是天一觀的道長攒射。 經常有香客問我,道長恒水,這世上最難降的妖魔是什么会放? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮钉凌,結果婚禮上咧最,老公的妹妹穿的比我還像新娘。我一直安慰自己御雕,他們只是感情好矢沿,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酸纲,像睡著了一般捣鲸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闽坡,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天栽惶,我揣著相機與錄音,去河邊找鬼疾嗅。 笑死媒役,一個胖子當著我的面吹牛,可吹牛的內容都是我干的宪迟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼交惯,長吁一口氣:“原來是場噩夢啊……” “哼次泽!你這毒婦竟也來了?” 一聲冷哼從身側響起席爽,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤意荤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后只锻,有當地人在樹林里發(fā)現了一具尸體玖像,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年齐饮,在試婚紗的時候發(fā)現自己被綠了捐寥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笤昨。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖握恳,靈堂內的尸體忽然破棺而出瞒窒,到底是詐尸還是另有隱情,我是刑警寧澤乡洼,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布崇裁,位于F島的核電站,受9級特大地震影響束昵,放射性物質發(fā)生泄漏拔稳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一锹雏、第九天 我趴在偏房一處隱蔽的房頂上張望巴比。 院中可真熱鬧,春花似錦逼侦、人聲如沸匿辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铲球。三九已至,卻和暖如春晰赞,著一層夾襖步出監(jiān)牢的瞬間稼病,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工掖鱼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留然走,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓戏挡,卻偏偏與公主長得像芍瑞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子褐墅,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

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