gpt4 book ai didi

rest - Camel Rest DSL 检索 HTTP POST 多部分文件

转载 作者:可可西里 更新时间:2023-11-01 16:10:52 26 4
gpt4 key购买 nike

我的 Router 类如下所示,我正在尝试上传视频文件并将其存储到文件位置。

SpringBootRouter.java

package com.camelrest;

import java.util.HashMap;
import java.util.Map;

import org.apache.camel.component.restlet.RestletComponent;
import org.apache.camel.spring.boot.FatJarRouter;
import org.restlet.Component;
import org.restlet.ext.spring.SpringServerServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class MySpringBootRouter extends FatJarRouter {

@Autowired
private MultipartProcessor multipartProcessor;

@Override
public void configure() {

restConfiguration().component("restlet");

rest("/upload").post().to("direct:upload");

from("direct:upload")
.to("file://E:/RestTest");

}

@Bean
public ServletRegistrationBean servletRegistrationBean() {

SpringServerServlet serverServlet = new SpringServerServlet();
ServletRegistrationBean regBean = new ServletRegistrationBean(
serverServlet, "/rest/*");

Map<String, String> params = new HashMap<String, String>();

params.put("org.restlet.component", "restletComponent");

regBean.setInitParameters(params);

return regBean;
}

@Bean
public Component restletComponent() {
return new Component();
}

@Bean
public RestletComponent restletComponentService() {
return new RestletComponent(restletComponent());
}
}

我正在尝试按照以下屏幕截图使用 postman 上传视频文件:

enter image description here

我上传的文件的内容保存在一个文件名中,该文件名带有 camel 生成的一些随机 camel ID

enter image description here

但是我想要在正文中传递的文件名

SampleVideo_1280x720_10mb.mp4

作为文件的名称,并从正文中删除以下内容

----------------------------948281627232093197119960
Content-Disposition: form-data; name="file"; filename="SampleVideo_1280x720_10mb.mp4"
Content-Type: video/mp4

因此最终输出可以是使用 postman 上传时使用的文件名上传的视频

最佳答案

您可以使用 MimeMultipartDataFormat解码多部分请求。使用这个,将准备附件,到Exchange .

之后你需要以某种方式转换 AttachmentInputStream 并填充 CamelFileName header 。有了这个任务可以帮助你小型Processor

路线:

from("direct:upload")
.unmarshal().mimeMultipart().split().attachments()
.process(new PrepareFileFromAttachment())
.to("file://C:/RestTest");

处理器:

class PrepareFileFromAttachment implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
DataHandler dataHandler = exchange.getIn().getBody(Attachment.class).getDataHandler();
exchange.getIn().setHeader(Exchange.FILE_NAME, dataHandler.getName());
exchange.getIn().setBody(dataHandler.getInputStream());
}
}

如果您的表单仅包含表单中的单个输入,则上述方法不起作用。这是因为 MimeMultipartDataFormat编码首先形成输入到正文(不存储文件名)和其他输入到存储文件名的附件。在这种情况下,您需要创建直接读取 InputStreamProcessor:

路线:

from("direct:upload")
.process(new ProcessMultipartRequest())
.to("file:c://RestTest");

处理器

public class ProcessMultipartRequest implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
InputStream is = exchange.getIn().getBody(InputStream.class);
MimeBodyPart mimeMessage = new MimeBodyPart(is);
DataHandler dh = mimeMessage.getDataHandler();
exchange.getIn().setBody(dh.getInputStream());
exchange.getIn().setHeader(Exchange.FILE_NAME, dh.getName());
}
}

关于rest - Camel Rest DSL 检索 HTTP POST 多部分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com