Java и base64-кодирование больших файлов, пробовал разные библиотеки - PullRequest
1 голос
/ 07 ноября 2019

У меня есть сервер с конечной точкой отдыха, который использует JSON-объект. Я могу отправить JSON-объект на сервер с файлами до 500 МБ, я кодирую файлы base64 перед отправкой и упаковываю их в JSONObject (org.codehaus.jettison.json.JSONObject). Работают файлы до определенного размера (около 500 МБ). Я мог бы отправлять файлы размером от 3 до 4 ГБ действительно.

Если есть другой способ упаковать файл вместо base64 перед упаковкой его в JSONObject, я приму этот совет (байтовый массив? ).

Среда: работает на Ubuntu18, память 16G (Free 10G), Swap 16G. Openjdk 1.8.

Я испробовал несколько подходов.

  1. java.util.base64 (JDK8)
  2. org.apache.commons.codec.binary. Base64 (версия 1.13)
  3. com.google.common.io.BaseEncoding (версия 23.0)

Ошибка в приведенном ниже примере всегда находится в строке:

String filePath = "/tmp/1gb.zip";
System.out.println("\t Post to  : ".concat(URL));
System.out.println("\t file : ".concat(filePath));
Path path = Paths.get(filePath);
byte[] bArray = Files.readAllBytes(path);
byte[] encodeBase64 = Base64.encodeBase64(bArray);
final String contentToBeSaved = new String(encodeBase64);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = null;
JSONObject metadata = new JSONObject();
metadata.put("owner", "Ingo");
metadata.put("access", "public");
metadata.put("licenseType", "CC BY");
metadata.put("fileName", "fileName");
metadata.put("fileDataBase64", contentToBeSaved);
String metadataFormatted = StringEscapeUtils.unescapeJavaScript(metadata.toString());
StringEntity entity = new StringEntity(metadataFormatted, ContentType.APPLICATION_JSON);
HttpPost post = new HttpPost(URL);
post.setEntity(entity);
response = client.execute(post);
HttpEntity responseEntity = response.getEntity();
String responseFromMediaserver = EntityUtils.toString(responseEntity, "UTF-8");
System.out.println("\n****");
System.out.println("Response is : " + responseFromMediaserver);
JSONObject json = new JSONObject(responseFromMediaserver);
String uuid = json.getString("uuid");
System.out.println("UUID is " + uuid);

Ошибка:

Exception in thread "main" java.lang.NegativeArraySizeException at org.apache.commons.codec.binary.BaseNCodec.resizeBuffer(BaseNCodec.java:253) at org.apache.commons.codec.binary.BaseNCodec.ensureBufferSize(BaseNCodec.java:269)
 at org.apache.commons.codec.binary.Base64.encode(Base64.java:380)
 at org.apache.commons.codec.binary.BaseNCodec.encode(BaseNCodec.java:451)
 at org.apache.commons.codec.binary.BaseNCodec.encode(BaseNCodec.java:430)
 at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:679)
 at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:642)
 at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:623)
 at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:556)
 at se.nrm.bio.mediaserver.testing.base64.NewClientEncodePost.posting(NewClientEncodePost.java:55)
 at se.nrm.bio.mediaserver.testing.base64.NewClientEncodePost.main(NewClientEncodePost.java:38)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...