Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和base64编码大文件,尝试了不同的库_Java_Json_Base64_Guava - Fatal编程技术网

Java和base64编码大文件,尝试了不同的库

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,我将接受这个建议(字节数组?) 环境:在

我有一个服务器,它有一个使用JSON对象的restful端点。 我能够向服务器发送一个JSON对象,其中包含高达500MB的文件,我在发送文件之前对文件进行base64编码,并将其打包到JSONObject(org.codehaus.jettison.JSON.JSONObject)中。达到一定大小的文件可以工作(约500MB)。我将能够发送文件高达3至4 GB的大小真的

如果在将文件包装到JSONObject之前,有其他方法来包装文件而不是base64,我将接受这个建议(字节数组?)

环境:在Ubuntu18上运行,内存16G(免费10G),交换16G。 OpenJDK1.8

我尝试了很多方法

  • java.util.base64(JDK8)
  • org.apache.commons.codec.binary.Base64(版本1.13)
  • 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)
    

    您真的想将其作为JSON而不是字节发送吗?我相信您需要修改Apache中的文件大小限制。虽然Base64能够处理如此大的文件,但它的设计并不是这样的。如果您想传输文件,您可能应该考虑其他选项,如通过http或ftp或其他方式简单传输文件。仅仅为了使用JSON而使用Base64编码是不值得的。谢谢!我正在发送的文件('contentToBeSaved')由另一个程序写入目录(zip文件),第一个要求是该文件将在单个消息中发送,而不是作为流发送,这可能会有问题。Guava的
    BaseEncoding
    支持流媒体,这可能很有用。但老实说,我真的认为你应该放弃在一大块JSON中发送整个内容。你真的想把它作为JSON而不是字节发送吗?我相信你需要修改Apache中的文件大小限制。虽然Base64能够处理如此大的文件,但它的设计并不是这样的。如果您想传输文件,您可能应该考虑其他选项,如通过http或ftp或其他方式简单传输文件。仅仅为了使用JSON而使用Base64编码是不值得的。谢谢!我正在发送的文件('contentToBeSaved')由另一个程序写入目录(zip文件),第一个要求是该文件将在单个消息中发送,而不是作为流发送,这可能会有问题。Guava的
    BaseEncoding
    支持流媒体,这可能很有用。但老实说,我真的认为你应该放弃用一大块JSON发送整个东西。