【问题标题】:Apache Camel server app receiving a multipart form POST (file upload)Apache Camel 服务器应用程序接收多部分表单 POST(文件上传)
【发布时间】:2012-03-01 06:16:42
【问题描述】:

我正在使用 Camel servlet 组件来接收 xml 文档,现在我还需要接收文件(jpeg、gif 等)。下面是我的客户端应用程序发送文件的方式:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpClientUploadHelper {
    public boolean upload(final File file, final String url) {
        boolean wasSent = false ;
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        MultipartEntity entity = new MultipartEntity();
        entity.addPart(file.getName(), new FileBody(file));
        post.setEntity(entity);
        try {
            HttpResponse response = client.execute(post);
            wasSent = response.getStatusLine().getStatusCode()==200;
        } catch (Exception e) {
        }
        return wasSent;
    }
}

然后我的 Camel 处理器以这种方式提取 HttpServletRequest:

HttpServletRequest req = exchange.getIn().getHeader(Exchange.HTTP_SERVLET_REQUEST, HttpServletRequest.class);

然后我有这个方法最终解析并保存文件:

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils

... class declaration, body, etc...

void parseAndSaveFile(final HttpServletRequest req) throws Exception {
    // Check that we have a file upload request 
    boolean isMultipart = ServletFileUpload.isMultipartContent(req);
    // Create a factory for disk-based file items
    FileItemFactory factory = new DiskFileItemFactory();
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // Parse the request
    FileItemIterator receivedFiles =  upload.getItemIterator(req);
    while (receivedFiles.hasNext()) {
          FileItemStream file = receivedFiles.next();
          if (file.isFormField()) {
            System.out.println("WTF?");
          } else {
            String fileName = file.getName();
            File uploadedFile = new File("/home/myuser/" + fileName);
            FileOutputStream out = new FileOutputStream(uploadedFile);
            IOUtils.copy(file.openStream(), out);
        }
    }
}

当我在 Camel 中使用上述代码时,isMultipart 标志为“true”,但 receivedFiles 迭代器不包含任何元素。当我在另一个项目中使用上面的代码时,只有一个普通的 servlet,代码就可以工作。在这两种方式中,我都使用码头作为 Web 容器。

那么有没有其他方法可以在我的骆驼处理器中提取文件名及其内容?

谢谢!

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    由于您使用的是 Jetty,您是否考虑过使用包含的 MultipartFilter 而不是 FileUpload 项目?超级干净且易于使用。

    来自 javadoc:

    “此类解码使用文件输入项的 HTML 表单发送的 multipart/form-data 流。发送的任何文件都存储到临时文件中,并将 File 对象作为属性添加到请求中。所有其他值通过普通的 getParameter API 提供,并且在将字节转换为字符串时遵循 setCharacterEncoding 机制。"

    【讨论】:

      【解决方案2】:

      这有帮助吗?

      公共无效进程(交换交换)抛出异常{ 消息输入 = exchange.getIn(); 设置名称 = in.getAttachmentNames(); for(字符串 n:名称){ System.out.println("附件"+n); 数据处理程序 h = in.getAttachment(n); 如果(h!=空){ 尝试 { 对象 o = h.getContent(); System.out.println(o); } 捕捉(异常 e){ // TODO 自动生成的 catch 块 e.printStackTrace(); } } } if(!names.isEmpty()) 返回; }

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 2017-10-21
        相关资源
        最近更新 更多