OutOfMemory для большого HTTP MultipartRequestEntity через apache HttpClient 3.1 - PullRequest
0 голосов
/ 05 декабря 2018

Я на самом деле пытаюсь загрузить файл (> 5M) с помощью apache HttpClient 3.1 через MultipartRequestEntity с java 1.4 в среде с низким объемом памяти, поэтому увеличение кучи Java невозможно

У меня есть файл, разбитый намного частей, мне просто нужно добавить все данные каждой части в запрос, я мог бы получить файл без разделения тоже

Реальная проблема заключается в том, что запрос, который я создаю, вызывает переполнение памятиЕсть ли способ избежать этого и иметь возможность отправить этот запрос сразу?

Это то, что у меня есть на самом деле, мне нужно добавить байты к части (разновидность части [0].write (data)) или получить поток для записи без загрузки в память, я не знаю, возможно ли это на самом деле

    HttpClient client = new HttpClient();
    PostMethod post = new PostMethod(url);

    post.setContentChunked(true);

    try {
        Part[] parts = new Part[fileNames.size()];

        String fileName = "sample.pdf";

        for(int i = 0; i<fileNames.size();i++){
            File file = Util.getFile(fileNames.get(i));
            FileInputStream is = new FileInputStream(file);
            byte[] fileBytes = IOUtils.toByteArray(is);
            parts[i] = new FilePart("file", new ByteArrayPartSource(fileName, fileBytes) , "application/octet-stream", post.getRequestCharSet()); 
            is.close();
            is = null;
            fileBytes = null;
        }

     MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts, post.getParams());

     post.setRequestEntity(requestEntity);


     int statusCode = client.executeMethod(post);

Другая возможность - HttpUrlConnection записывает BufferedWriter, но этотакже выдают OutOfMemory при записи на него

1 Ответ

0 голосов
/ 10 декабря 2018

Я мог бы сделать это непосредственно с классом файла Java, но проблема заключалась в том, что у меня нет класса файла Java, вместо этого мне пришлось реализовать PartSource для чтения моего специального класса файлов и настроить его на чтение после присоединения ко всем моимфайловые части в одном файле обязательно.Обычно вы должны сделать это:

parts[0] = new FilePart("file", new FilePartSource(file) , "application/octet-stream", postMethod.getRequestCharSet()); 

Вам нужен файл, если вы не хотите получать целые данные, буферизованные в памяти для запроса

Теперь я решил эту проблему

...