请原谅我的词汇量可能不准确。 我正在通过Jersey使用ApacheHttpClient将一个文件发送到我们的Berkeley DBXML服务器,由CherryPy处理。你知道吗
传输是通过分块而不是流编码发送的-因为我们添加了一个ProgressBar。使用GUI发送文件,在GUI中指定服务器地址、文件以及是否覆盖。文件可以是XML或XLS/X
我遇到的问题是,在提交XML并选择“overwrite”选项时,CherryPy只接收请求参数中的'dict:{“overwrite”,“1”}',并声明“data”字段(应该包含实际的XML文件)为空。你知道吗
在java方面,如果我拉出BodyParts
的FormData
,我会看到它有文件和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。你知道吗
有什么建议吗?这是内在的缺陷还是我做错了什么?你知道吗
我们用的樱桃糖是开箱即用的--没有修改。你知道吗
谢谢你! 肖恩
对于那些有类似问题的人…我已经“解决”了。你知道吗
结果是XML文件太小(<;1Kb),无法通过分块编码进行处理。你知道吗
为什么?不知道。但使用更大的文件,我可以覆盖和提交他们罚款,与所有formvars目前。。。你知道吗
编辑:默认分块大小为8192字节,或8kb。上传会一直失败,直到文件大小大于等于8kb,所以我相信apache希望至少上传一个块。你知道吗
所以…随便了。感谢阅读!你知道吗
相关问题 更多 >
编程相关推荐