搜尋

首頁  >  問答  >  主體

圖片上傳 - Android上傳圖片到Java服務端出現的問題

我在Android端上傳圖片的時候URL如果使用的內網IP,用內部網路上傳圖片的時候是沒有問題的,但是如果我Android端URL使用外網IP的話,只能使用公司內部網路才能正確上傳,用自己流量或其他外部網路只能上傳幾十k的圖片,上傳大一點的就上傳不了。之前覺得可能是外網有什麼限制,但是今天在家透過服務端的測試頁面(如下圖)上傳圖片,也成功了,所以感覺外網應該也沒有什麼限制,實在不知道是什麼原因了,有大神知道嗎?急求答案,謝謝!試過用Socket上傳,也是一樣的狀況,會出現一樣的問題。

#Android端程式碼:

public class HttpUpLoadImageUtil {
    static String BOUNDARY = java.util.UUID.randomUUID().toString();
    static String PREFIX = "--", LINEND = "\r\n";
    static String MULTIPART_FROM_DATA = "multipart/form-data";
    static String CHARSET = "UTF-8";

    public static void doPostPicture(String urlStr, Map<String,Object> paramMap, File pictureFile )
            throws Exception{

        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setDoInput(true);// 允许输入
        conn.setDoOutput(true);// 允许输出
        conn.setUseCaches(false);
        conn.setReadTimeout(10 * 1000); // 缓存的最长时间
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);


        DataOutputStream os =  new DataOutputStream(conn.getOutputStream());

        StringBuilder sb = new StringBuilder(); //用StringBuilder拼接报文,用于上传图片数据
        sb.append(PREFIX);
        sb.append(BOUNDARY);
        sb.append(LINEND);
        sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + pictureFile.getName() + "\"" + LINEND);
        sb.append("Content-Type: image/jpg; charset=" + CHARSET + LINEND);
        sb.append(LINEND);
        os.write(sb.toString().getBytes());
        InputStream is = new FileInputStream(pictureFile);

        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len); //写入图片数据
        }
        is.close();

        os.write(LINEND.getBytes());

        StringBuilder text = new StringBuilder();
        for(Map.Entry<String,Object> entry : paramMap.entrySet()) { //在for循环中拼接报文,上传文本数据
            text.append("--");
            text.append(BOUNDARY);
            text.append("\r\n");
            text.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
            text.append(entry.getValue());
            text.append("\r\n");
        }
        os.write(text.toString().getBytes("utf-8")); //写入文本数据

        // 请求结束标志
        byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
        os.write(end_data);
        os.flush();
        os.close();

        // 得到响应码
        int res = conn.getResponseCode();
        System.out.println("asdf code "+ res);
        System.out.println("asdf " + conn.getResponseMessage());
        conn.disconnect();
    }
}
大家讲道理大家讲道理2720 天前696

全部回覆(1)我來回復

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-12 09:21:48

    能成功的話代碼出問題的可能性是不大的,如果要是出錯了至少需要得到錯誤訊息才能排查。

    回覆
    0
  • 取消回覆