首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpURLConnection的HttpEntity替代方案

HttpURLConnection的HttpEntity替代方案
EN

Stack Overflow用户
提问于 2016-02-25 19:03:18
回答 1查看 1K关注 0票数 0

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

现在我有以下代码片段:

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
$file = $_POST['file'];
$file_name = $_POST['file_name'];
$file_size = $_POST['file_size'];

我不能改变服务器实现。

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

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-02-25 19:24:37

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

代码语言:javascript
复制
AndroidMultiPartEntity entity = new AndroidMultiPartEntity();
File sourceFile = new File("yourpathhere");
entity.addPart("userfile", new FileBody(sourceFile));

您可以按如下方式编写服务器代码

代码语言:javascript
复制
 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:

代码语言:javascript
复制
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);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35625444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档