javascript 发送 post 参数和文件

javascript send post parameters with file

尝试上传带有某些参数的文件,我已将 Ext upload plugin 更改为上传带有 post 参数的文件。
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 或纯 java 脚本或 Java spring controller 的答案将不胜感激。
这是一个相关问题:formdata-appendkey-value-is-not-working

你粘贴的request payload是正确的FormData格式,我们也说multipart/form-data。

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

我找到了答案here
multipart/form-data 3.0 版之前的 Servlet API 确实默认不支持编码请求。 Servlet API 默认使用 application/x-www-form-urlencoded 编码解析参数。当使用不同的编码时,request.getParameter() 调用将全部 return 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);
            }
        }