Принудительное чтение всего файла в память с помощью первого `getFileBytes () для передачи одним фрагментом, скорее всего, приводит к тому, что системе не хватает памяти.
Найдите способ чтенияоколо 100K, передайте его, затем прочитайте еще 100, пока весь файл не будет готов.
Конструктор класса HttpMultipartRequest
в том виде, в котором он написан, допускает только передачу файла как одного единственного объекта.Несмотря на то, что это реализация протокола MIME, состоящего из нескольких частей, он ограничен случаем передачи только одной части:
Класс можно изменить, чтобы разрешить отправку нескольких частей.Взгляните на спецификацию протокола RFC1341 , особенно пример на полпути.
С этими тремя строками, находящимися в конструкторе, весь файл отправляется в одной части;
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());
Но в случае с несколькими частями необходимо иметь несколько границ, прежде чем endBoundary
:
for(bytes=getMoreFileBytes(); ! bytes.empty; bytes=getMoreFileBytes()){
bos.write(boundaryMessage.getBytes());
bos.write(bytes);
}
bos.write(endBoundary.getBytes());
В качестве быстрого исправления позвольте конструктору открыть файл и прочитатьэто 100к за раз.Он уже получает параметр fileName
.
Сценарий PHP на другом конце должен собрать исходный файл из частей.