Java Proxy Servlet для отправки файлов - PullRequest
4 голосов
/ 18 марта 2010

Я пытаюсь использовать Panda с моим приложением GWT.Я могу загружать видео прямо на мой сервер panda, используя

POST MY_PANDA_SERVER/videos/MY_VIDEO_ID/upload

Однако я хотел бы скрыть свой сервер panda за моим сервером J2EE (glassfish).Я хотел бы добиться этого:

  1. Начать загрузку в какой-нибудь сервлет на моем сервере J2EE
  2. Аутентифицировать пользователя
  3. POST файл на моем сервере panda, все еще загружая вservlet

В идеале я бы никогда не хотел сохранять файл на сервере J2EE, а просто использовать его в качестве прокси-сервера для доступа к серверу panda.

Ответы [ 4 ]

6 голосов
/ 23 марта 2010

Commons FileUpload хорош, но не достаточен в вашем случае. Он будет анализировать все тело в памяти перед предоставлением файловых элементов (и потоков). Вы не заинтересованы в отдельных пунктах. По сути, вы просто хотите передать тело запроса с одной стороны на другую прозрачно, не изменяя его и не сохраняя в памяти каким-либо образом. FileUpload будет только анализировать тело запроса в некоторые «пригодные для использования» объекты Java, а HttpClient будет снова создавать только то же самое тело запроса на основе этих объектов Java. Эти объекты Java также потребляют память.

Для этого вам не нужна библиотека (или она должна быть Commons IO , чтобы заменить цикл for на oneliner, используя IOUtils#copy()). Достаточно только базовых Java NET и IO API. Вот начальный пример:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    URLConnection connection = new URL("http://your.url.to.panda").openConnection();
    connection.setDoOutput(true); // POST.
    connection.setRequestProperty("Content-Type", request.getHeader("Content-Type")); // This one is important! You may want to check other request headers and copy it as well.

    // Set streaming mode, else HttpURLConnection will buffer everything.
    int contentLength = request.getContentLength();
    if (contentLength > -1) {
        // Content length is known beforehand, so no buffering will be taken place.
        ((HttpURLConnection) connection).setFixedLengthStreamingMode(contentLength);
     } else {
        // Content length is unknown, so send in 1KB chunks (which will also be the internal buffer size).
        ((HttpURLConnection) connection).setChunkedStreamingMode(1024);
    }

    InputStream input = request.getInputStream();
    OutputStream output = connection.getOutputStream();
    byte[] buffer = new byte[1024]; // Uses only 1KB of memory!

    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
        output.flush();
    }

    output.close();
    connection.getInputStream(); // Important! It's lazily executed.
}
0 голосов
/ 22 декабря 2015

Лучшее решение - использовать компонент сервлета apache-camel: http://camel.apache.org/servlet.html

0 голосов
/ 23 марта 2010

Опираясь на ответ Энрике, я также рекомендую использовать FileUpload и HttpClient. FileUpload может дать вам поток загруженного файла:

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();

// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
    FileItemStream item = iter.next();
    String name = item.getFieldName();
    InputStream stream = item.openStream();
    if (item.isFormField()) {
        System.out.println("Form field " + name + " with value "
            + Streams.asString(stream) + " detected.");
    } else {
        System.out.println("File field " + name + " with file name "
            + item.getName() + " detected.");
        // Process the input stream
        ...
    }
}

Затем вы можете использовать HttpClient или HttpComponents для выполнения POST. Вы можете найти пример здесь .

0 голосов
/ 18 марта 2010

Вы можете использовать Apache Commons File Upload , чтобы получить файл. Затем вы можете использовать http client , чтобы загрузить файл на сервер panda с помощью POST. С помощью загрузки файлов Apache Commons вы можете обработать файл в памяти, поэтому вам не нужно его хранить.

...