Серверное приложение Apache Camel, получающее многочастную форму POST (загрузка файла) - PullRequest
1 голос
/ 08 февраля 2012

Я использую компонент сервлета Camel для получения XML-документов, и теперь мне также нужно получать файлы (jpegs, gifs и т. Д.). Итак, вот как мое клиентское приложение отправляет файл:

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;
    }
}

мой процессор верблюдов извлекает запрос 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», но этот итератор receiveFiles не содержит никаких элементов. Когда я использую приведенный выше код в другом проекте с простым сервлетом, код работает. В обоих случаях я использую причал в качестве веб-контейнера.

Так есть ли другой способ извлечь имя файла и его содержимое в моем верблюжьем процессоре?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2012

Помогает ли это?

    public void process(Exchange exchange) throws Exception {
          Message in = exchange.getIn();
          Set names = in.getAttachmentNames();
          for(String n: names) {
              System.out.println("attachment "+n);
              DataHandler h = in.getAttachment(n);
              if(h!=null) {
                  try {
                    Object o = h.getContent();
                      System.out.println(o);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }             
              }
          }
          if(!names.isEmpty())
              return;
    }
0 голосов
/ 09 февраля 2012

Поскольку вы используете Jetty, рассматривали ли вы вопрос об использовании MultipartFilter вместо проекта FileUpload?Супер чистый и простой в использовании.

Из javadoc:

"Этот класс декодирует поток multipart / form-data, отправляемый HTML-формой, использующей элемент ввода файла. Любые отправленные файлыхранится во временном файле, а объект File добавляется к запросу в качестве атрибута. Все остальные значения становятся доступными через обычный API getParameter, а механизм setCharacterEncoding учитывается при преобразовании байтов в строки. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...