2014-11-04 75 views
0

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

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(字节)base64编码;

+0

你是否检查过你收到所有字节?你可能会碰到php的post_max_size或apache/nginx限制。 – bart 2014-11-04 21:20:30

+0

谢谢你。是的,post_max_size是足够的...我如何检查Apache的限制? – JB2 2014-11-04 23:01:11

+0

将文件映射到字节并将缓冲区包装在POST的'byteArrayEntity'中。 – 2014-11-05 00:56:56

回答

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(); 

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