【问题标题】:HttpEntity replacement for HttpURLConnection [duplicate]HttpURLConnection的HttpEntity替换[重复]
【发布时间】:2016-06-08 02:49:32
【问题描述】:

由于 Android 开发人员删除了 Apache HTTP 客户端,我正在转向 HttpURLConnection。我能够重写我的所有功能,除了一个。 我正在发送带有名称和日期的字节数组(图像)。实际上我的功能允许一次发送许多图像,但我只发送一个。 到目前为止,我一直在使用 MultipartEntityBuilder 构建 HttpEntity 并通过 httpPost.setEntity(entity) 设置它。但是我想摆脱 MultipartEntityBuilder。

现在我有以下代码 sn-p:

public void sendImage(URL url, byte[] image, String name, long date) {
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);

    MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    entityBuilder.addBinaryBody("file[]", image);
    entityBuilder.addTextBody("file_name[]", name);
    entityBuilder.addTextBody("file_size[]", String.valueOf(date));
    HttpEntity entity = entityBuilder.build();

    conn.addRequestProperty(entity.getContentType().getName(), entity.getContentType().getValue());

    OutputStream os = conn.getOutputStream();
    entity.writeTo(os);
    os.close();

    conn.connect();

    // read response code
}

在服务器端我可以接收这样的数据:

$file = $_POST['file'];
$file_name = $_POST['file_name'];
$file_size = $_POST['file_size'];

我无法更改服务器实现。

我尝试了这个线程的解决方案: Sending files using POST with HttpURLConnection 但我不知道如何将其调整到我的服务器。

有没有办法摆脱 HttpEntity?我现在不想使用其他库(Volley、OkHttp 或 Retrofit)。将来我可能会搬到其中之一。

感谢您的帮助。

【问题讨论】:

    标签: android http http-post httpurlconnection


    【解决方案1】:

    要将文件发送到服务器,您需要使用 MultipartEntity 类,您可以编写如下所示。您可以将数据传递给它,如下所示..

    AndroidMultiPartEntity entity = new AndroidMultiPartEntity();
    File sourceFile = new File("yourpathhere");
    entity.addPart("userfile", new FileBody(sourceFile));
    

    你可以编写你的服务器代码如下

     HttpClient httpclient = new DefaultHttpClient();
     HttpPost httppost = new HttpPost(targetURL);
     httppost.setEntity(entity);
    
     // Making server call
     HttpResponse responseObj = httpclient.execute(httppost);
     HttpEntity r_entity = responseObj.getEntity();
    
     int statusCode = responseObj.getStatusLine().getStatusCode();
    
     if (statusCode == 200) {
      // Server response
         response = EntityUtils.toString(r_entity);
     } else {
         response = "Error occurred! Http Status Code: "+ statusCode;
     }
    

    MultipartEntityClass:-

    public class AndroidMultiPartEntity extends MultipartEntity
    
    {
    
        //private final ProgressListener listener;
    
        public AndroidMultiPartEntity() {
            super();
            //this.listener = listener;
        }
    
        public AndroidMultiPartEntity(final HttpMultipartMode mode,
                                      final ProgressListener listener) {
            super(mode);
            //this.listener = listener;
        }
    
        public AndroidMultiPartEntity(HttpMultipartMode mode, final String boundary,
                                      final Charset charset, final ProgressListener listener) {
            super(mode, boundary, charset);
            //this.listener = listener;
        }
    
        @Override
        public void writeTo(final OutputStream outstream) throws IOException {
            super.writeTo(new CountingOutputStream(outstream));
        }
    
        public static interface ProgressListener {
            void transferred(long num);
        }
    
        public static class CountingOutputStream extends FilterOutputStream {
    
            //  private final ProgressListener listener;
            private long transferred;
    
            public CountingOutputStream(final OutputStream out) {
                super(out);
    //  this.listener = listener;
                this.transferred = 0;
            }
    
            public void write(byte[] b, int off, int len) throws IOException {
                out.write(b, off, len);
                this.transferred += len;
                //this.listener.transferred(this.transferred);
            }
    
            public void write(int b) throws IOException {
                out.write(b);
                this.transferred++;
                //this.listener.transferred(this.transferred);
            }
        }
    }
    

    【讨论】:

    • 我知道如何使用 Apache HTTP 客户端来做到这一点。更清楚一点:我不想使用“org.apache.http”paclage 中的类。
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2016-06-07
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多