Java和base64编码大文件,尝试了不同的库
我有一个服务器,它有一个使用JSON对象的restful端点。 我能够向服务器发送一个JSON对象,其中包含高达500MB的文件,我在发送文件之前对文件进行base64编码,并将其打包到JSONObject(org.codehaus.jettison.JSON.JSONObject)中。达到一定大小的文件可以工作(约500MB)。我将能够发送文件高达3至4 GB的大小真的 如果在将文件包装到JSONObject之前,有其他方法来包装文件而不是base64,我将接受这个建议(字节数组?) 环境:在Ubuntu18上运行,内存16G(免费10G),交换16G。 OpenJDK1.8 我尝试了很多方法Java和base64编码大文件,尝试了不同的库,java,json,base64,guava,Java,Json,Base64,Guava,我有一个服务器,它有一个使用JSON对象的restful端点。 我能够向服务器发送一个JSON对象,其中包含高达500MB的文件,我在发送文件之前对文件进行base64编码,并将其打包到JSONObject(org.codehaus.jettison.JSON.JSONObject)中。达到一定大小的文件可以工作(约500MB)。我将能够发送文件高达3至4 GB的大小真的 如果在将文件包装到JSONObject之前,有其他方法来包装文件而不是base64,我将接受这个建议(字节数组?) 环境:在
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)
您真的想将其作为JSON而不是字节发送吗?我相信您需要修改Apache中的文件大小限制。虽然Base64能够处理如此大的文件,但它的设计并不是这样的。如果您想传输文件,您可能应该考虑其他选项,如通过http或ftp或其他方式简单传输文件。仅仅为了使用JSON而使用Base64编码是不值得的。谢谢!我正在发送的文件('contentToBeSaved')由另一个程序写入目录(zip文件),第一个要求是该文件将在单个消息中发送,而不是作为流发送,这可能会有问题。Guava的
BaseEncoding
支持流媒体,这可能很有用。但老实说,我真的认为你应该放弃在一大块JSON中发送整个内容。你真的想把它作为JSON而不是字节发送吗?我相信你需要修改Apache中的文件大小限制。虽然Base64能够处理如此大的文件,但它的设计并不是这样的。如果您想传输文件,您可能应该考虑其他选项,如通过http或ftp或其他方式简单传输文件。仅仅为了使用JSON而使用Base64编码是不值得的。谢谢!我正在发送的文件('contentToBeSaved')由另一个程序写入目录(zip文件),第一个要求是该文件将在单个消息中发送,而不是作为流发送,这可能会有问题。Guava的BaseEncoding
支持流媒体,这可能很有用。但老实说,我真的认为你应该放弃用一大块JSON发送整个东西。