java - Apache Camel Restlet - 无法提取多部分数据
问题描述
我必须使用 Apache Camel (2.12.4) Restlet 从浏览器和进程接收文件上传。由于我的解决方案不起作用,为了简化,目前我的路线定义非常简单,就像这样
from("restlet:/upload?restletMethod=POST")
.to("file:///<path.to.dir>//?fileName=<dump-file.http>");
使用 Postman,我正在上传一个简单的 java 类文件和表单值,目的是检索它们。我希望能够将类文件写回文件并执行以证明创建成功。
为此,我编写了一个简单的实用工具,它使用 org.apache.commons.fileupload.MultipartStream 读取转储文件;现在是打印标题和正文。
public class MultipartDataExtractor {
public static final String DELIMITER = "\\r?\\n";
public static void main(String[] args) throws Exception {
byte[] boundary = "----------------------------002984755777142240671505".getBytes(); // copying from dump file
FileInputStream fis = new FileInputStream(new File("<path.to.dir>/<dump-file.http>"));
parseMultipartStream(fis, boundary);
}
public static void parseMultipartStream(InputStream is, byte[] boundary) throws Exception {
MultipartStream multipartStream = new MultipartStream(is, boundary, 1024 * 4, null);
System.out.println("Trying to read multipart data");
boolean nextPart = multipartStream.skipPreamble();
while (nextPart) {
String headers = multipartStream.readHeaders();
System.out.println(String.format("headers: [%s]", headers));
multipartStream.readBodyData(System.out);
System.out.println("");
nextPart = multipartStream.readBoundary();
}
}
}
我在从 servlet 提取内容时创建的文件上成功使用了此工具。在骆驼转储文件上,它运行但即使内容看起来不错,也无法解析。multipartStream.skipPreamble() 返回 false,在调试时我发现,它在内部抛出 MalformedException,并从 catch 块返回 false。转储的文件看起来像这样
----------------------------002984755777142240671505
Content-Disposition: form-data; name="file"; filename="HelloWorld.class"
Content-Type: application/java-vm
����4
<init>()VCodeLineNumberTablemain([Ljava/lang/String;)V
SourceFileHelloWorld.javaHello World
HelloWorldjava/lang/Objectjava/lang/SystemoutLjava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V *��
% ���
----------------------------002984755777142240671505
Content-Disposition: form-data; name="name"
Hans Muster
----------------------------002984755777142240671505--
我不确定出了什么问题。任何指针或帮助将不胜感激。
解决方案
推荐阅读
- javascript - 在轮询发生之前状态不会更新
- powershell - 检查是否在多台服务器上安装了 Windows 安全补丁
- snakemake - 是否可以通过 Python Snakemake 中的函数返回规则?
- flutter - 如何在 Flutter 中实现 Apple 应用内订阅
- python - 将行列表转换为 Pandas 中的频率表
- java - 如何在java中修复循环while/try catch错误
- c# - c# HttpClient 似乎是删除而不是随机发布
- android - Android Kotlin 处理 EditText 更改事件
- grafana - Grafana 仪表板未显示数据(在 EKS 上)
- css - React子组件定位重叠问题