Сервлет Прокси Java для представления файлов

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

POST MY_PANDA_SERVER/videos/MY_VIDEO_ID/upload

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

  1. Запустите загрузку на некоторый сервлет на моем сервере J2EE
  2. Аутентифицируйте пользователя
  3. POST файл к моему серверу панды при тихой загрузке на сервлет

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

5
задан BalusC 19 March 2010 в 12:33
поделиться

3 ответа

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

Для этого вам не нужна библиотека (или она должна быть Commons IO , чтобы заменить цикл for на одинарный лайнер с использованием 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.
}
7
ответ дан 14 December 2019 в 08:47
поделиться

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

0
ответ дан 14 December 2019 в 08:47
поделиться

Основываясь на ответе Энрике, я Также рекомендую использовать 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
ответ дан 14 December 2019 в 08:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: