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

2024-09-27 07:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我遇到的问题是,在提交XML并选择“overwrite”选项时,CherryPy只接收请求参数中的'dict:{“overwrite”,“1”}',并声明“data”字段(应该包含实际的XML文件)为空。你知道吗

在java方面,如果我拉出BodyPartsFormData,我会看到它有文件和overwrite命令。只有overwrite命令才能进入Cherrypy。你知道吗

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

奇怪的是,它只适用于XML文件——XLS/X文件可以提交,然后用覆盖的方式重新提交。它们在客户端的处理方式是完全相同的,只是在服务器端解析时处理方式不同,但并没有做到这一点。你知道吗

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

该文件作为filedataodypart添加到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的“data”字段就丢失了,只存在overwrite!重申一下,这只适用于XML,而不适用于XLS。你知道吗

有什么建议吗?这是内在的缺陷还是我做错了什么?你知道吗

我们用的樱桃糖是开箱即用的--没有修改。你知道吗

谢谢你! 肖恩


Tags: 文件服务器addnewdataif方式xml
1条回答
网友
1楼 · 发布于 2024-09-27 07:17:11

对于那些有类似问题的人…我已经“解决”了。你知道吗

结果是XML文件太小(<;1Kb),无法通过分块编码进行处理。你知道吗

为什么?不知道。但使用更大的文件,我可以覆盖和提交他们罚款,与所有formvars目前。。。你知道吗

编辑:默认分块大小为8192字节,或8kb。上传会一直失败,直到文件大小大于等于8kb,所以我相信apache希望至少上传一个块。你知道吗

所以…随便了。感谢阅读!你知道吗

相关问题 更多 >

    热门问题