XML 格式的 fileDataBodyPart 未通过 ApacheHttpClient 上传到 CherryPy

Posted

技术标签:

【中文标题】XML 格式的 fileDataBodyPart 未通过 ApacheHttpClient 上传到 CherryPy【英文标题】:XML formatted fileDataBodyPart not uploading via ApacheHttpClient to CherryPy 【发布时间】:2014-04-25 19:57:03 【问题描述】:

请原谅我可能不准确的词汇。 我通过 Jersey 使用 ApacheHttpClient 将文件发送到我们的 Berkeley DBXML 服务器,由 CherryPy 处理。

传输是通过分块而不是流编码发送的 - 因为我们添加了一个 ProgressBar。使用 GUI 发送文件,您可以在其中指定服务器地址、文件以及是否覆盖。文件可以是 XML 或 XLS/X。

我遇到的问题是,当提交 XML 并选择“覆盖”选项时,CherryPy 仅在请求参数中收到 'dict: "overwrite","1"',并声称“数据”字段 -- 应该包含实际的 XML 文件 -- 是空的。

在 java 方面,如果我拉出FormDataBodyParts,我看到它有文件和覆盖命令。只有覆盖命令才能到达 Cherrypy。

现在,取消选择覆盖,数据确实会被发送,但显然,此时不会覆盖。

奇怪的是,它只适用于 XML 文件----XLS/X 文件可以提交,并且可以覆盖重新提交。它们在客户端的处理方式完全相同 - 只是在服务器端解析期间处理方式不同,但并没有那么远。

在我们切换到分块编码之前,功能运行良好。以下是代码摘录:

文件作为 fileDataBodyPart 添加到 FormDataMultiPart 的实例中。 UploadWorker 句柄

public void add(File file, boolean overwrite, UploadWorker worker) 
 
    guilog = worker;  // if non null, output by publishing to worker
    //start filter here, pass in bytes
    long fbytes = file.length();
    String basename = Util.stripExt(file);

    //we recreate filters so that progress is reported properly
    //necessary for folder imports
    client.removeAllFilters();
    client.addFilter(new ConnectionListenerFilter(new ListenerFactory(fbytes,worker.progress,basename)));

    // Build a multipart POST form to be submitted

    // Prepare the metadata file for attachment.
    // We do this before creating the multipart form as we
    // won't have to close it out if there's problems here
    // and we bail.


    FileDataBodyPart bodypart;
    try 
        bodypart = fileDataBodyPart("data", file);
     catch (Throwable t) 
        bodypart = null;
    
    if (bodypart == null) 
        return;  // error msg handled as a side effect
    



    MediaType media = MultiPartMediaTypes.createFormData();
    FormDataMultiPart formdata = new FormDataMultiPart();
    formdata.setMediaType(media);

            //THIS IS SIMPLIFIED EXAMPLE HARDCODED OVERWRITE

    formdata = formdata.field("overwrite", "1");

        //I have also tried
    //FormDataBodyPart bp = new FormDataBodyPart("overwrite","1");
    //formdata.bodyPart(bp);


    formdata.bodyPart(bodypart);  // attach metadata
            WebResource add = resourceCollection.path("add");

    try 
        response = add.type(media)
                .accept(MediaType.APPLICATION_XML,MediaType.TEXT_PLAIN)  //TEXT_PLAIN
                .post(ClientResponse.class, formdata);
        resIn = response.getEntityInputStream();
        responseText = convertStreamToString(resIn);
        status = response.getStatus();

带有try 的各种捕获。据我所知,JavaClient 端工作正常,但是一旦服务器代码收到 POST,formdata 的“数据”字段就丢失了,只存在覆盖!重申一下,这仅适用于 XML,不适用于 XLS。

有什么建议吗?这是一些固有的错误还是我做错了什么?

我们使用的 CherryPy 是开箱即用的——没有修改。

谢谢! 肖恩

【问题讨论】:

【参考方案1】:

对于那些有类似问题的人......我已经“解决”了它。

原来 XML 文件太小(

为什么?不知道。但是使用更大的文件我可以覆盖并提交它们,所有的formvars都存在......

编辑:默认分块大小为 8192 字节或 8kb。上传会一直失败,直到文件大小 >= 8kb,所以我相信 apache 预计至少要上传一个块。

所以..随便。感谢阅读!

【讨论】:

以上是关于XML 格式的 fileDataBodyPart 未通过 ApacheHttpClient 上传到 CherryPy的主要内容,如果未能解决你的问题,请参考以下文章

xml中设定编码格式

json数据格式和xml数据格式的区别和用法是啥?

json数据格式和xml数据格式的区别和用法是啥?

xml格式用excel打开提示啊支持程序打开

XML解析失败:格式不符

ue 怎么格式化xml