通过 ajax 和 groovy 形成数据

formdata via ajax with groovy

我正在尝试通过 ajax 将图像文件和相应信息传输到 groovlet 服务器。

问题: 我无法从 HTTPServletRequest 对象中获取数据。

这是我用来传输数据的 Javascript-代码:

$("#submitButton").click( function(){
        if ( submitButtonCondition == true ) {

            //Gathering Data                
            var enabledValue = false;
            if ($("#activate").val()){
                enabledValue = true;
            }       
            var metadata = $("#metaTextarea").val();                                
            var inputFile = $("#fileInput")[0].files[0];

            // Creating FormData-Object filled with necessary Data
            var formData = new FormData();      
            formData.append('file', inputFile);
            formData.append('enabled', enabledValue);
            formData.append('metadata', metadata);

            // Sending FormData to Server
            $.ajax({
                type : 'POST',
                url : '/createNewEntry.groovy',
                contentType: false,
                processData: false,
                data: formData,
                success: function(resultData){  
                    console.log("Upload successful");
                },
                failure: function(resultData){
                    console.log("Upload failed");
                }
            });
        }
    }); 

验证数据是否已发送的唯一方法是访问请求对象的附加 reader:System.out.println(request.reader.text);

输出如下所示:

------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="file"; filename="blatest.png"
Content-Type: image/png


------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="enabled"

true
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="metadata"

asdfasdfasdf
------WebKitFormBoundaryzNUfRksUAVW2ioCa--

这么明显数据已经转移了? 尽管如此,我仍在努力从方法 getParameter, getParameterMap, getParameterNames, getParameterValues 中获取信息,这些方法都没有输出。

您收到服务器端多部分请求

通常你的request应该是instanceof

http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html

你可以使用以下方法:

  • Part getPart(java.lang.String name) 获取具有给定名称的零件。
  • java.util.Collection<Part> getParts()

设法使用以下外部库获取部件:

org.apache.commons.fileupload org.apache.commons.io

代码看起来像这样:

// Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // Figure out ServerContext
    ServletContext servletContext = context;

    // Configure a repository (to ensure a secure temp location is used)
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");

    // Set factory constraints
    factory.setSizeThreshold(50000);
    factory.setRepository(repository);

    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);

    // Parse the request
    List<FileItem> items = upload.parseRequest(request);

    // Process the uploaded items
    Iterator<FileItem> iter = items.iterator();

    while (iter.hasNext()) {
        FileItem item = iter.next()
        if (item.isFormField()) {
            processFormField(item);

        } else {
            processUploadedFile(item, servletContext);
        }
    }   

requestresponse 与 groovlet 对象相关。

方法processFormField()ProcessUploadedFile()可以访问表单数据和缓存文件。

例如,

processFormField() 通过以下方式访问信息:

    private void processFormField(FileItem item) {
    String name = item.getFieldName()
    String value = item.getString()
    if (name=="enabled") {
        queryEnabledValue=value;
    }
    if (name=="metadata") {
        queryMetadata=value;
    }
}