【问题标题】:Posting Base64 encoded video files using HttpClient使用 HttpClient 发布 Base64 编码的视频文件
【发布时间】:2014-11-04 20:46:27
【问题描述】:

我正在尝试使用 HttpClient 将媒体文件发布到服务器。我的代码适用于图像文件,但无法重播视频文件 (mp4)。我发布文件的代码:

   HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httppost = new HttpPost(REMOTE + "/add_file.php");

    MultipartEntityBuilder mpEntity = MultipartEntityBuilder.create();
    ContentBody cbFile = null;
    String mimeType = "";
    if (file.getName().endsWith(".jpg") || file.getName().endsWith(".jpeg")) {
        mimeType = "image/jpeg";
    } else if (file.getName().endsWith(".mp4")) {
         mimeType = "video/mp4";
    }


    mpEntity.addTextBody("recipient_phone", recipientPhoneStr);
    mpEntity.addTextBody("sender_phone", "55000");
    mpEntity.addTextBody("sender_key", "my_secret");
    mpEntity.addTextBody("file_name", file.getName());

    mpEntity.addTextBody("userfile", encodeFileToBase64Binary(file));

    httppost.setEntity(mpEntity.build());

    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();


    if (response.getStatusLine().toString().compareTo(HTTP_ERROR) == 0) {
        throw new IOException(HTTP_ERROR);
    }

    if (resEntity != null) {
        System.out.println(EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
        resEntity.consumeContent();
    }

    httpclient.getConnectionManager().shutdown();

文件使用 Base64.encodeBase64String(bytes); 进行 Base64 编码;

【问题讨论】:

  • 您是否检查过您是否正确接收了所有字节?您可能正在达到 php 的 post_max_size 或 apache/nginx 限制。
  • 谢谢巴特。是的,post_max_size 就足够了...如何检查 apache 限制?
  • 将文件映射到字节并将缓冲区包装在 'byteArrayEntity' 中以供 POST 使用。

标签: java httpclient apache-commons


【解决方案1】:

https://hc.apache.org/httpcomponents-client-4.3.x/examples.html

查看示例 POST 程序...

使用以下内容将 mp4 映射到字节,然后将其包装在正确的“实体”类型中以执行 POST..

            FileInputStream fis = new FileInputStream(mfile); 
            FileChannel fc = fis.getChannel(); // Get the file's size and then map it into memory
            int sz = (int)fc.size();
            MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
            byte[] data2 = new byte[bb.remaining()];
            bb.get(data2);
            ByteArrayEntityHC4 reqEntity = new ByteArrayEntityHC4(data2);
            httpPost.setEntity(reqEntity);
            fis.close();

然后根据 POST 类型的请求调用 exec。

【讨论】:

  • 这是发送视频文件(mp4、mov)的绝佳解决方案。其他解决方案仅适用于 pdf/ppt/text 等,但不适用于 mp4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多