打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android端通过HttpURLConnection上传文件到服务器
package com.demo.http;
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Random;
import android.os.Handler;
import android.util.Base64;
import android.util.Log;
public class UploadImageTask implements APIURLConstants {
    private String requestURL = DOMAIN_ADDRESS + UPLOAD_DESIGN_IMAGE_URL; // default
    private final String CRLF = "\r\n";
    private Handler handler;
    private String token;
    public UploadImageTask(String token, Handler handler) {
        this.handler = handler;
        this.token = token;
    }
    public String execute(File...files) {
        InputStream inputStream = null;
        HttpURLConnection urlConnection = null;
        FileInputStream fileInput = null;
        DataOutputStream requestStream = null;
        handler.sendEmptyMessage(50);
        try {
            // open connection
            URL url = new URL(requestURL.replace("{token}", this.token));
            urlConnection = (HttpURLConnection) url.openConnection();
            // create random boundary
            Random random = new Random();
            byte[] randomBytes = new byte[16];
            random.nextBytes(randomBytes);
            String boundary = Base64.encodeToString(randomBytes, Base64.NO_WRAP);
            /* for POST request */
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.setUseCaches(false);
            urlConnection.setRequestMethod("POST");
            long size = (files[0].length() / 1024);
            if(size >= 1000) {
                handler.sendEmptyMessage(-150);
                return "error";
            }
            // 构建Entity form
            urlConnection.setRequestProperty("Connection", "Keep-Alive");
            urlConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            urlConnection.setRequestProperty("Cache-Control", "no-cache");
             
            // never try to chunked mode, you need to set a lot of things
            //  if(size > 400) {
            //      urlConnection.setChunkedStreamingMode(0);
            //  }
            //  else {
            //      urlConnection.setFixedLengthStreamingMode((int)files[0].length());
            //  }
            // end comment by zhigang on 2016-01-19
             
            /* upload file stream */
            fileInput = new FileInputStream(files[0]);
            requestStream = new DataOutputStream(urlConnection.getOutputStream());
            String nikeName = "myfile";
            requestStream = new DataOutputStream(urlConnection.getOutputStream());
            requestStream.writeBytes("--" + boundary + CRLF);
            requestStream.writeBytes("Content-Disposition: form-data; name=\"" + nikeName + "\"; filename=\"" + files[0].getName() + "\""+ CRLF);
            requestStream.writeBytes("Content-Type: " + getMIMEType(files[0]) + CRLF);
            requestStream.writeBytes(CRLF);
            // 写图像字节内容
            int bytesRead;
            byte[] buffer = new byte[8192];
            handler.sendEmptyMessage(50);
            while((bytesRead = fileInput.read(buffer)) != -1) {
                requestStream.write(buffer, 0, bytesRead);
            }
            requestStream.flush();
            requestStream.writeBytes(CRLF);
            requestStream.flush();
            requestStream.writeBytes("--" + boundary + "--" + CRLF);
            requestStream.flush();
            fileInput.close();
            // try to get response
            int statusCode = urlConnection.getResponseCode();
            if (statusCode == 200) {
                inputStream = new BufferedInputStream(urlConnection.getInputStream());
                String imageuuId = HttpUtil.convertInputStreamToString(inputStream);
                Log.i("image-uuid", "uploaded image uuid : " + imageuuId);
                handler.sendEmptyMessage(50);
                return imageuuId;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(requestStream != null) {
                try {
                    requestStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fileInput != null) {
                try {
                    fileInput.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        handler.sendEmptyMessage(50);
        return null;
    }
    private String getMIMEType(File file) {
        String fileName = file.getName();
        if(fileName.endsWith("png") || fileName.endsWith("PNG")) {
            return "image/png";
        }
        else {
            return "image/jpg";
        }
    }
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android网络连接处理学习笔记
使用HttpURLConnection实现多线程下载
Android自动检测版本及自动升级
Android异步下载网络图片(其二)
Android网络请求心路历程
Android 用户管理专题之基于OAuth2协议的服务认证
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服