转载

Golang 1.6: 使用jQuery.iframe-Transport.js做Ajax文件上传并处理multipart Form

本文测试环境Golang 1.6, jQuery 1.12.3

之前写过一篇文章: jQuery.iframe-Transport.js来发送Ajax文件上传请求对返回JSON的处理 ,就是讲使用这个jQuery插件时对返回JSON数据的处理,该插件会内置一个 <iframe> 这样就可以实现 ajaxmultipart/form-data 实现,注意这样做主要是为了兼容低版本浏览器,如果不考虑IE < 10的话,可以直接使用XHR2,参考 这个链接 .

所以代码还是和以前一样,如下(HTML):

<form id="avatarForm" enctype="multipart/form-data">     <input id="avatarUpload" name="avatarUpload" type="file" /> </form> 

JavaScript:

// avatarUpload是上面的type = “file”的input元素 // 每当选择文件后立即发送Ajax请求 $('#avatarUpload').change(function() {     //'upload'是具体发送POST请求针对的服务器URL     $.ajax('upload', {         type: 'POST',         files: $('#avatarUpload'),         iframe: true,         // 注意如果服务器返回结果是JSON,dataType要设置         dataType: 'json'     }).done(function(data) {         // 这里data是JavaScript对象         console.log('done()', data);     }).fail(function() {         console.log('fail()');     }).always(function() {         console.log('always()');     }); }); 

接下来在Golang中,处理这个 <form> ,首先调用 http.RequestParseMultipartForm 方法来处理 multipart/form-data ,参数是内存内的最大Buffer大小,如果没有错误的话,返回一个 multipart.Form 对象,里面的 File 属性会包含用户上传文件的信息,具体请参考 文档 ,这里我们通过 logMultipartForm 函数简单把里面的数据坐下输出,如下代码:

// 输出multipart.Form内的数据 func logMultipartForm(form *multipart.Form) {     log.Print("Values:", form.Value)     log.Print("Files:")     for key := range form.File {         headers := form.File[key]         for _, header := range headers {             log.Printf("Key: %v, Filename: %v, Header: %v", key, header.Filename, header.Header)         }     } }  // 处理POST请求的Handler // Handler的声明可能根据不同路由HTTP框架而不一样 func fileUploadHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {     err := r.ParseMultipartForm(1024 * 50) //50kb buffer     if err != nil {         http.Error(w, err.Error(), http.StatusInternalServerError)         return     }     form := r.MultipartForm     logMultipartForm(form)     /* 后面省略 */ } 

示例输出:

Values: map[X-Requested-With:[IFrame] X-HTTP-Accept:[application/json, text/javascript, */*; q=0.01]] Files: Key: avatarUpload, Filename: IMG_1156.jpg, Header: map[Content-Disposition:[form-data; name="avatarUpload"; filename="IMG_1156.jpg"] Content-Type:[image/jpeg]] 
原文  https://www.mgenware.com/blog/?p=3093
正文到此结束
Loading...