请原谅我可能不准确的词汇。我通过 Jersey 使用 ApacheHttpClient 将文件发送到我们的 Berkeley DBXML 服务器,由 CherryPy 处理。
传输是通过分块而不是流编码发送的——因为我们添加了一个 ProgressBar。使用 GUI 发送文件,您可以在其中指定服务器地址、文件以及是否覆盖。文件可以是 XML 或 XLS/X。
我遇到的问题是,当提交 XML 并选择“覆盖”选项时,CherryPy 仅在请求参数中收到 'dict: {"overwrite","1"}',并声称“数据”字段 -应该包含实际的 XML 文件 -- 是空的。
在 java 方面,如果我拉出BodyParts
,FormData
我看到它有文件和覆盖命令。只有覆盖命令才能到达 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 是开箱即用的——没有修改。
谢谢!肖恩