Commons FileUpload приятный, но недостаточный в вашем случае. Он будет анализировать весь объект в памяти перед предоставлением файлов (и потоков). Вас не интересуют отдельные предметы. В основном вы просто хотите прозрачно передать тело запроса с одной на другую, не изменяя его или не сохраняя в памяти. FileUpload будет анализировать тело запроса только на некоторые «пригодные для использования» объекты Java, а HttpClient только создаст тот же самый объект запроса снова на основе этих объектов Java. Те объекты Java также потребляют память.
Для этого вам не нужна библиотека (или она должна быть Commons IO для замены петли for
с помощью oneliner с использованием IOUtils#copy()
). Достаточно просто базового API 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.
}
Вы, сэр, мой герой. Любая идея, как получить ответ от моего сервера Panda и отправить его обратно моему клиенту? – KevMo
Тело ответа доступно 'connection.getInputStream()'. Просто напишите его так же, как 'response.getOutputStream()'. Вы можете получить необходимые заголовки ответов с помощью 'connection.getHeaderFields()' и передать его через 'response.setHeader (name, value)'. – BalusC
, если вы загружаете большие файлы, он убьет ваш java-сервер. Это то, что у меня есть в моем приложении, каждый раз, когда я загружаю файл размером более 200 мб, я получаю java.lang.OutOfMemoryError: Java heap space. Как это исправить? – Maksim