1. 程式人生 > >使用HttpURLConnection請求資料、上傳檔案、圖片等

使用HttpURLConnection請求資料、上傳檔案、圖片等

NetWorkUtils.java


import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.util.Log;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @author Jun
 * @time 2016/9/1  18:40
 * @desc 網路請求
 */
public class NetWorkUtils {

    /**
     * GET的網路請求
     *
     * @param urlPath
     * @return
     */
    public static String doGet(String urlPath) {

        String result = "";
        BufferedReader reader = null;
        HttpURLConnection conn = null;
        Log.i("amumu", "asdsa");

        try {
            URL url = new URL(urlPath);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            Log.i("amumu", "a11");
            int code = conn.getResponseCode();
            Log.i("amumu", "a1122");
            if (code == 200) {
                Log.i("amumu", "a11333");
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    result += line;
                }
            }
            Log.i("amumu", "a14441");
        } catch (Exception e) {
            Log.i("amumu", "444");
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                conn.disconnect();
            }
        }

        return result;
    }

    /**
     * POST的網路請求
     *
     * @param urlPath
     * @param paramsMap
     * @return
     */
    public static String doPost(String urlPath, Map<String, String> paramsMap) {
        String result = "";
        BufferedReader reader = null;
        HttpURLConnection conn = null;
        try {
            URL url = new URL(urlPath);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("X-bocang-Authorization", "token"); //token可以是使用者登入後的token等等......
            conn.setDoOutput(true);
            String parames = "";
            for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
                parames += ("&" + entry.getKey() + "=" + entry.getValue());
            }
            conn.getOutputStream().write(parames.substring(1).getBytes());
            if (conn.getResponseCode() == 200) {
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    result += line;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                conn.disconnect();
            }
        }
        return result;
    }

    private static int TIME_OUT = 10 * 1000;   //超時時間
    private static String CHARSET = "utf-8"; //設定編碼

    /**
     * android上傳檔案到伺服器
     *
     * @param file       需要上傳的檔案
     * @param RequestURL 請求的rul
     * @return 返回響應的內容
     */
    public static String uploadFile(Drawable file, String RequestURL, Map<String, String> param, String imageName) {
        String result = null;
        String BOUNDARY = UUID.randomUUID().toString();  //邊界標識   隨機生成
        String PREFIX = "--", LINE_END = "\r\n";
        String CONTENT_TYPE = "multipart/form-data";   //內容型別
        // 顯示進度框
        //      showProgressDialog();
        try {
            URL url = new URL(RequestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIME_OUT);
            conn.setConnectTimeout(TIME_OUT);
            conn.setDoInput(true);  //允許輸入流
            conn.setDoOutput(true); //允許輸出流
            conn.setUseCaches(false);  //不允許使用快取
            conn.setRequestMethod("POST");  //請求方式
            conn.setRequestProperty("Charset", CHARSET);  //設定編碼
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("X-bocang-Authorization", "token"); //token可以是使用者登入後的token等等......
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
            if (file != null) {
                Log.v("520it", "觸發到");
                /**
                 * 當檔案不為空,把檔案包裝並且上傳
                 */
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                StringBuffer sb = new StringBuffer();

                String params = "";
                if (param != null && param.size() > 0) {
                    Iterator<String> it = param.keySet().iterator();
                    while (it.hasNext()) {
                        sb = null;
                        sb = new StringBuffer();
                        String key = it.next();
                        String value = param.get(key);
                        sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
                        sb.append("Content-Disposition: form-data; name=\"")
                                .append(key)
                                .append("\"")
                                .append(LINE_END)
                                .append(LINE_END);
                        sb.append(value).append(LINE_END);
                        params = sb.toString();
                        dos.write(params.getBytes());
                    }
                }
                sb = new StringBuffer();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                /**
                 * 這裡重點注意:
                 * name裡面的值為伺服器端需要key   只有這個key 才可以得到對應的檔案
                 * filename是檔案的名字,包含字尾名的   比如:abc.png
                 */
                sb.append("Content-Disposition: form-data; name=\"")
                        .append("avatar")
                        .append("\"")
                        .append(";filename=\"")
                        .append(imageName)
                        .append("\"\n");
                sb.append("Content-Type: image/png");
                sb.append(LINE_END).append(LINE_END);
                dos.write(sb.toString().getBytes());
                InputStream is = Drawable2InputStream(file);
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = is.read(bytes)) != -1) {
                    dos.write(bytes, 0, len);
                }
                is.close();
                dos.write(LINE_END.getBytes());
                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                dos.write(end_data);
                dos.flush();
                /**
                 * 獲取響應碼  200=成功
                 * 當響應成功,獲取響應的流
                 */

                int res = conn.getResponseCode();
                System.out.println("res=========" + res);
                if (res == 200) {
                    InputStream input = conn.getInputStream();
                    StringBuffer sb1 = new StringBuffer();
                    int ss;
                    while ((ss = input.read()) != -1) {
                        sb1.append((char) ss);
                    }
                    result = sb1.toString();
                } else {
                }
            } else {
                Log.v("520it", "觸發不到");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * android上傳檔案到伺服器
     *
     * @param RequestURL 請求的rul
     * @return 返回響應的內容
     */
    public static String uploadMoreFile(List<Bitmap> files, String RequestURL, Map<String, String> param, String imageName) {
        String result = null;
        String BOUNDARY = UUID.randomUUID().toString();  //邊界標識   隨機生成
        String PREFIX = "--", LINE_END = "\r\n";
        String CONTENT_TYPE = "multipart/form-data";   //內容型別
        // 顯示進度框
        //      showProgressDialog();
        try {
            URL url = new URL(RequestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIME_OUT);
            conn.setConnectTimeout(TIME_OUT);
            conn.setDoInput(true);  //允許輸入流
            conn.setDoOutput(true); //允許輸出流
            conn.setUseCaches(false);  //不允許使用快取
            conn.setRequestMethod("POST");  //請求方式
            conn.setRequestProperty("Charset", CHARSET);  //設定編碼
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("X-bocang-Authorization", "token"); //token可以是使用者登入後的token等等......
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);


            Log.v("520it", "觸發到");
            /**
             * 當檔案不為空,把檔案包裝並且上傳
             */
            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
            StringBuffer sb = new StringBuffer();

            String params = "";
            if (param != null && param.size() > 0) {
                Iterator<String> it = param.keySet().iterator();
                while (it.hasNext()) {
                    sb = null;
                    sb = new StringBuffer();
                    String key = it.next();
                    String value = param.get(key);
                    sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
                    sb.append("Content-Disposition: form-data; name=\"")
                            .append(key)
                            .append("\"")
                            .append(LINE_END)
                            .append(LINE_END);
                    sb.append(value).append(LINE_END);
                    params = sb.toString();
                    dos.write(params.getBytes());
                }
            }

            /**
             * 這裡重點注意:
             * name裡面的值為伺服器端需要key   只有這個key 才可以得到對應的檔案
             * filename是檔案的名字,包含字尾名的   比如:abc.png
             */

            for (int i = 0; i < files.size(); i++) {
                sb = new StringBuffer();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                sb.append("Content-Disposition: form-data; name=\"")
                        .append("image[]")
                        .append("\"")
                        .append(";filename=\"")
                        .append(System.currentTimeMillis()+".jpg")
                        .append("\"\n");
                sb.append("Content-Type: image/png");
                sb.append(LINE_END).append(LINE_END);
                dos.write(sb.toString().getBytes());
                InputStream is = Bitmap2InputStream(files.get(i));
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = is.read(bytes)) != -1) {
                    dos.write(bytes, 0, len);
                }
                is.close();

                dos.write(LINE_END.getBytes());
                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                dos.write(end_data);
            }


            dos.flush();
            /**
             * 獲取響應碼  200=成功
             * 當響應成功,獲取響應的流
             */

            int res = conn.getResponseCode();
            System.out.println("res=========" + res);
            if (res == 200) {
                InputStream input = conn.getInputStream();
                StringBuffer sb1 = new StringBuffer();
                int ss;
                while ((ss = input.read()) != -1) {
                    sb1.append((char) ss);
                }
                result = sb1.toString();
            } else {
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * android上傳檔案到伺服器
     *
     * @param file       需要上傳的檔案
     * @param RequestURL 請求的rul
     * @return 返回響應的內容
     */
    public static String uploadFile(Bitmap file, String RequestURL, Map<String, String> param, String imageName) {
        String result = null;
        String BOUNDARY = UUID.randomUUID().toString();  //邊界標識   隨機生成
        String PREFIX = "--", LINE_END = "\r\n";
        String CONTENT_TYPE = "multipart/form-data";   //內容型別
        // 顯示進度框
        //      showProgressDialog();
        try {
            URL url = new URL(RequestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIME_OUT);
            conn.setConnectTimeout(TIME_OUT);
            conn.setDoInput(true);  //允許輸入流
            conn.setDoOutput(true); //允許輸出流
            conn.setUseCaches(false);  //不允許使用快取
            conn.setRequestMethod("POST");  //請求方式
            conn.setRequestProperty("Charset", CHARSET);  //設定編碼
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("X-bocang-Authorization", "token"); //token可以是使用者登入後的token等等......
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
            if (file != null) {
                /**
                 * 當檔案不為空,把檔案包裝並且上傳
                 */
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                StringBuffer sb = new StringBuffer();

                String params = "";
                if (param != null && param.size() > 0) {
                    Iterator<String> it = param.keySet().iterator();
                    while (it.hasNext()) {
                        sb = null;
                        sb = new StringBuffer();
                        String key = it.next();
                        String value = param.get(key);
                        sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
                        sb.append("Content-Disposition: form-data; name=\"")
                                .append(key)
                                .append("\"")
                                .append(LINE_END)
                                .append(LINE_END);
                        sb.append(value).append(LINE_END);
                        params = sb.toString();
                        dos.write(params.getBytes());
                    }
                }
                sb = new StringBuffer();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                /**
                 * 這裡重點注意:
                 * name裡面的值為伺服器端需要key   只有這個key 才可以得到對應的檔案
                 * filename是檔案的名字,包含字尾名的   比如:abc.png
                 */
                sb.append("Content-Disposition: form-data; name=\"")
                        .append("image")
                        .append("\"")
                        .append(";filename=\"")
                        .append(imageName)
                        .append("\"\n");
                sb.append("Content-Type: image/png");
                sb.append(LINE_END).append(LINE_END);
                dos.write(sb.toString().getBytes());
                InputStream is = Bitmap2InputStream(file);
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = is.read(bytes)) != -1) {
                    dos.write(bytes, 0, len);
                }


                is.close();
                //                dos.write(file);
                dos.write(LINE_END.getBytes());
                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                dos.write(end_data);

                dos.flush();
                /**
                 * 獲取響應碼  200=成功
                 * 當響應成功,獲取響應的流
                 */

                int res = conn.getResponseCode();
                System.out.println("res=========" + res);
                if (res == 200) {
                    InputStream input = conn.getInputStream();
                    StringBuffer sb1 = new StringBuffer();
                    int ss;
                    while ((ss = input.read()) != -1) {
                        sb1.append((char) ss);
                    }
                    result = sb1.toString();
                } else {
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String getSomething(String path) {
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        String returnCode = "-1";// 預設-1表示提交失敗
        try {
            URL url = new URL(path);

            conn = (HttpURLConnection) url.openConnection();

            conn.setRequestMethod("GET");
            conn.setConnectTimeout(30000); // 連線的超時時間
            conn.setReadTimeout(30000); // 讀資料的超時時間
            conn.setDoOutput(true); // 必須設定此方法, 允許輸出
            conn.setRequestProperty("Content-Type", "application/text"); // 設定請求頭訊息,可以設定多個
            conn.connect();

            int responseCode = conn.getResponseCode();
            returnCode = responseCode + "";
            if (responseCode == 200) {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = is.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                returnCode = baos.toString(); // 把流中的資料轉換成字串, 採用的編碼是: utf-8
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != baos)
                    baos.close();
                if (null != is)
                    is.close();
                if (null != conn)
                    conn.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return returnCode;
    }


    /**
     * GET的網路請求
     * @param urlPath
     * @return
     */
    public static String doGet(String urlPath){
        String result="";
        BufferedReader reader=null;
        HttpURLConnection conn=null;
        try{
            URL url=new URL(urlPath);
            conn= (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(30000); // 連線的超時時間
            conn.setReadTimeout(30000); // 讀資料的超時時間
            conn.setDoOutput(true); // 必須設定此方法, 允許輸出
            conn.setRequestProperty("Content-Type", "application/text"); // 設定請求頭訊息,可以設定多個
            conn.connect();

            int code = conn.getResponseCode();
            if(code==200){
                reader=new BufferedReader(new
                        InputStreamReader(conn.getInputStream()));
                String line="";
                while((line=reader.readLine())!=null) {
                    result+=line;
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(reader!=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                conn.disconnect();
            }
        }

        return result;
    }

    // 將Bitmap轉換成InputStream
    public static InputStream Bitmap2InputStream(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 65, baos);
        InputStream is = new ByteArrayInputStream(baos.toByteArray());
        return is;
    }

    // Drawable轉換成InputStream
    public static InputStream Drawable2InputStream(Drawable d) {
        Bitmap bitmap = drawable2Bitmap(d);
        return Bitmap2InputStream(bitmap);
    }

    // Drawable轉換成Bitmap
    public static Bitmap drawable2Bitmap(Drawable drawable) {
        Bitmap bitmap = Bitmap.createBitmap(
                        drawable.getIntrinsicWidth(),
                        drawable.getIntrinsicHeight(),
                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
    }
}