javascript使用文件发送post参数

时间:2015-01-25 16:44:32

标签: java extjs upload multipartform-data payload

尝试上传包含一些参数的文件,我已更改Ext upload plugin以上传一些带有帖子参数的文件。
ext uploader代码(ux.upload.uploader.FormDataUploader):

uploadItem : function(item) {
     file = item.getFileApiObject();

    item.setUploading();

     formData = new FormData();

    // mycode goes here to append some parameters
    formData.append(file.name, file);

     xhr = this.initConnection();

    xhr.setRequestHeader(this.filenameHeader, file.name);
    xhr.setRequestHeader(this.sizeHeader, file.size);
    xhr.setRequestHeader(this.typeHeader, file.type);

    var loadendhandler = Ext.Function.bind(this.onLoadEnd, this, [
            item
        ], true);

    var progresshandler = Ext.Function.bind(this.onUploadProgress, this, [
            item
        ], true);

    xhr.addEventListener('loadend', loadendhandler, true);
    xhr.upload.addEventListener("progress", progresshandler, true);

    xhr.send(formData);
},
initConnection : function() {
    var xhr = new XMLHttpRequest(),
        method = this.method,
        url = this.url;

    xhr.open(method, url, true);

    this.abortXhr = function() {
        this.suspendEvents();
        xhr.abort();
        this.resumeEvents();
    };

    return xhr;
},

我尝试了这两行代码:

formData.append("ali","ghasemi");
formData.append("alisd","ghassdf");

但是以下列方式将参数添加到请求有效负载中:

------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="ali"

ghasemi
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="alisd"

ghassdf
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="icon-info.gif"; filename="icon-info.gif"
Content-Type: image/gif

GIF89a 

如何在服务器端获取post参数或如何在客户端正确设置这些参数?
我在java spring中编码。 HttpServletRequest不知道这些参数。

public JSONObject upload(HttpServletRequest request, HttpServletResponse response, @RequestBody String body) throws IOException {
    String ali = request.getParameter("ali"); // returns null
} 

Ext或纯javascript或Java spring controller中的任何答案都将受到赞赏 这是一个相关的问题:formdata-appendkey-value-is-not-working

2 个答案:

答案 0 :(得分:0)

您粘贴的请求有效负载是FormData的正确格式,我们也说多部分/表单数据。

在php中: 您可以使用$ _POST来获取这些参数,例如ali,alisd。 并使用$ _FILES获取上传文件。

答案 1 :(得分:0)

我找到了答案here 版本3.0之前的Servlet API默认不支持multipart / form-data编码的请求。 Servlet API默认使用application/x-www-form-urlencoded编码解析参数。使用其他编码时,request.getParameter()调用将全部返回null。如果您已经使用Servlet 3.0(Glassfish 3,Tomcat 7等),那么您可以使用HttpServletRequest#getParts()代替。另请参阅此博客以获取扩展示例。

在Servlet 3.0之前,解析multipart/form-data请求的事实标准将使用 Apache Commons FileUpload 。只需仔细阅读其“用户指南”和“常见问题解答”部分,即可了解如何使用它。我在此之前发布了一个代码示例的答案(它还包含一个针对Servlet 3.0的示例)。

java代码:

        Map properties = new HashMap();
        List<FileItem> items;

        items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                properties.put(fieldName, fieldValue);
            } else {

                String tempString = "d:/io";
                //String fileName = FilenameUtils.getName(item.getName());
                //fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
                file = new File(tempString + '/' + item.getName());

                item.write(file);
            }
        }