1. 程式人生 > >Android 自己封裝HttpUrlConnection上傳圖片和欄位

Android 自己封裝HttpUrlConnection上傳圖片和欄位

/** * Created by hui on 2017/5/8. */ import android.util.Log; 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.MalformedURLException; import java.net.URL; import
java.util.Iterator; import java.util.Map; import java.util.UUID; /** * * 上傳工具類 * @author spring sky<br> * Email :[email protected]<br> * QQ: 840950105<br> * 支援上傳檔案和引數 */ public class UploadUtil { private static UploadUtil uploadUtil; private static final String BOUNDARY = UUID.randomUUID().toString(); // 邊界標識 隨機生成
private static final String PREFIX = "--"; private static final String LINE_END = "\r\n"; private static final String CONTENT_TYPE = "multipart/form-data"; // 內容型別 private UploadUtil() { } /** * 單例模式獲取上傳工具類 * @return */ public static UploadUtil getInstance() { if
(null == uploadUtil) { uploadUtil = new UploadUtil(); } return uploadUtil; } private static final String TAG = "UploadUtil"; private int readTimeOut = 10 * 1000; // 讀取超時 private int connectTimeout = 10 * 1000; // 超時時間 /*** * 請求使用多長時間 */ private static int requestTime = 0; private static final String CHARSET = "utf-8"; // 設定編碼 /*** * 上傳成功 */ public static final int UPLOAD_SUCCESS_CODE = 1; /** * 檔案不存在 */ public static final int UPLOAD_FILE_NOT_EXISTS_CODE = 2; /** * 伺服器出錯 */ public static final int UPLOAD_SERVER_ERROR_CODE = 3; protected static final int WHAT_TO_UPLOAD = 1; protected static final int WHAT_UPLOAD_DONE = 2; /** * android上傳檔案到伺服器 * * @param filePath * 需要上傳的檔案的路徑 * @param fileKey * 在網頁上<input type=file name=xxx/> xxx就是這裡的fileKey * @param RequestURL * 請求的URL */ public void uploadFile(String filePath, String fileKey, String RequestURL, Map<String, String> param) { if (filePath == null) { sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"檔案不存在"); return; } try { File file = new File(filePath); uploadFile(file, fileKey, RequestURL, param); } catch (Exception e) { sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"檔案不存在"); e.printStackTrace(); return; } } /** * android上傳檔案到伺服器 * * @param file * 需要上傳的檔案 * @param fileKey * 在網頁上<input type=file name=xxx/> xxx就是這裡的fileKey * @param RequestURL * 請求的URL */ public void uploadFile(final File file, final String fileKey, final String RequestURL, final Map<String, String> param) { if (file == null || (!file.exists())) { sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"檔案不存在"); return; } Log.i(TAG, "請求的URL=" + RequestURL); Log.i(TAG, "請求的fileName=" + file.getName()); Log.i(TAG, "請求的fileKey=" + fileKey); new Thread(new Runnable() { //開啟執行緒上傳檔案 @Override public void run() { toUploadFile(file, fileKey, RequestURL, param); } }).start(); } private void toUploadFile(File file, String fileKey, String RequestURL, Map<String, String> param) { String result = null; requestTime= 0; long requestTime = System.currentTimeMillis(); long responseTime = 0; try { URL url = new URL(RequestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(readTimeOut); conn.setConnectTimeout(connectTimeout); conn.setDoInput(true); // 允許輸入流 conn.setDoOutput(true); // 允許輸出流 conn.setUseCaches(false); // 不允許使用快取 conn.setRequestMethod("POST"); // 請求方式 conn.setRequestProperty("Charset", CHARSET); // 設定編碼 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); // conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); /** * 當檔案不為空,把檔案包裝並且上傳 */ DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); StringBuffer sb = null; 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(); Log.i(TAG, key+"="+params+"##"); dos.write(params.getBytes()); // dos.flush(); } } sb = null; params = null; sb = new StringBuffer(); /** * 這裡重點注意: name裡面的值為伺服器端需要key 只有這個key 才可以得到對應的檔案 * filename是檔案的名字,包含字尾名的 比如:abc.png */ sb.append(PREFIX).append(BOUNDARY).append(LINE_END); sb.append("Content-Disposition:form-data; name=\"" + fileKey //fileKey上傳檔案的名字,有時這個需要跟後臺確定一下 + "\"; filename=\"" + file.getName() + "\"" + LINE_END); sb.append("Content-Type:image/pjpeg" + LINE_END); // 這裡配置的Content-type很重要的 ,用於伺服器端辨別檔案的型別的 sb.append(LINE_END); params = sb.toString(); sb = null; Log.i(TAG, file.getName()+"=" + params+"##"); dos.write(params.getBytes()); /**上傳檔案*/ InputStream is = new FileInputStream(file); onUploadProcessListener.initUpload((int)file.length()); byte[] bytes = new byte[1024]; int len = 0; int curLen = 0; while ((len = is.read(bytes)) != -1) { curLen += len; dos.write(bytes, 0, len); onUploadProcessListener.onUploadProcess(curLen); } is.close(); dos.write(LINE_END.getBytes()); byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(); dos.write(end_data); dos.flush(); // // dos.write(tempOutputStream.toByteArray()); /** * 獲取響應碼 200=成功 當響應成功,獲取響應的流 */ int res = conn.getResponseCode(); responseTime = System.currentTimeMillis(); this.requestTime = (int) ((responseTime-requestTime)/1000); Log.e(TAG, "response code:" + res); if (res == 200) { Log.e(TAG, "request success"); InputStream input = conn.getInputStream(); StringBuffer sb1 = new StringBuffer(); int ss; while ((ss = input.read()) != -1) { sb1.append((char) ss); } result = sb1.toString(); Log.e(TAG, "result : " + result); sendMessage(UPLOAD_SUCCESS_CODE, "上傳結果:" + result); return; } else { Log.e(TAG, "request error"); sendMessage(UPLOAD_SERVER_ERROR_CODE,"上傳失敗:code=" + res); return; } } catch (MalformedURLException e) { sendMessage(UPLOAD_SERVER_ERROR_CODE,"上傳失敗:error=" + e.getMessage()); e.printStackTrace(); return; } catch (IOException e) { sendMessage(UPLOAD_SERVER_ERROR_CODE,"上傳失敗:error=" + e.getMessage()); e.printStackTrace(); return; } } /** * 傳送上傳結果 * @param responseCode * @param responseMessage */ private void sendMessage(int responseCode,String responseMessage) { onUploadProcessListener.onUploadDone(responseCode, responseMessage); } /** * 下面是一個自定義的回撥函式,用到回撥上傳檔案是否完成 * * @author shimingzheng * */ public static interface OnUploadProcessListener { /** * 上傳響應 * @param responseCode * @param message */ void onUploadDone(int responseCode, String message); /** * 上傳中 * @param uploadSize */ void onUploadProcess(int uploadSize); /** * 準備上傳 * @param fileSize */ void initUpload(int fileSize); } private OnUploadProcessListener onUploadProcessListener; public void setOnUploadProcessListener( OnUploadProcessListener onUploadProcessListener) { this.onUploadProcessListener = onUploadProcessListener; } public int getReadTimeOut() { return readTimeOut; } public void setReadTimeOut(int readTimeOut) { this.readTimeOut = readTimeOut; } public int getConnectTimeout() { return connectTimeout; } public void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; } /** * 獲取上傳使用的時間 * @return */ public static int getRequestTime() { return requestTime; } public static interface uploadProcessListener{ } }

相關推薦

Android 自己封裝HttpUrlConnection圖片

/** * Created by hui on 2017/5/8. */ import android.util.Log; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; imp

Android中使用HttpPost圖片資料

1、首先需要對應的JAR包 匯入 httpmime-4.1.1.jar package url;   import io.IoStreamUtil;   import java.io.File;   import java.io.IOException;   imp

Android圖片文字到伺服器

1. 首先到Appache官網下載第三方jar包httpmime(可以到這裡下載http://download.csdn.net/detail/likesidehu/9651525,這個jar包配合下面程式碼驗證沒問題) 2. 伺服器地址: http://localhost

AFNetWorking3.0 圖片 簡單封裝

{          NSString *url = @"";//放上傳圖片的網址     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//初始化請求物件     manager.responseSerializer = [A

Android端通過HttpURLConnection文件到server

cache ddr not turn popu real god reat rep Android端通過HttpURLConnection上傳文件到server一:實現原理近期在做Androidclient的應用開發,涉及到要把圖片上傳到後臺server中。自己選擇了做S

自己封裝framworks到應用商店報錯

script uil iss strong find lac targe 內容 link 參考鏈接: http://www.jianshu.com/p/60ac3ded34a0 http://ikennd.ac/blog/2015/02/stripping-unwanted

ajax之---圖片預覽

上傳圖片 TE obj ret upload play targe review sta views.py def upload_img(request): nid=str(uuid.uuid4()) ret={‘status‘:True,‘data‘:None

[Python] Django框架入門5——靜態文件、中間件、圖片分頁

manage input 上傳文件 數據分頁 提交 family 數據 3.5 func 說明:   本文主要描述Django其他的內容,涉及靜態文件處理、中間件、上傳文件、分頁等。   開發環境:win10、Python3.5、Django1.10。    一、靜態文件處

七牛圖片二進制流方法

mini ram uuid 方法 throws rom ack 其他 try package com.qlyd.aspmanager.common.qiniu;import com.alibaba.fastjson.JSON;import com.google.gson.G

簡單的PHP圖片刪除圖片示例程式碼

分享一例簡單的PHP上傳圖片和刪除圖片示例程式碼,很簡單,適合初學的朋友參考,用來研究php上傳圖片還是不錯的。 <?phpif (!empty($_FILES["img"]["name"])) { //提取檔案域內容名稱,並判斷$path=”uppic/”; //上傳路徑if(!file_exist

vue中同時使用element元件的upload圖片wangEditor富文字編輯器

1.wangEditor —— 輕量級 web 富文字編輯器,配置方便,使用簡單。支援 IE10+ 瀏覽器。 下載wangEditor:npm install wangeditor(英文小寫) 官網:www.wangEditor.com 文件:www.kancloud.cn/wa

如何使用elementUI呼叫一次介面同時圖片檔案,同時需要攜帶其他引數,實現呼叫後端介面

今天有一個坑,同時要上傳圖片和檔案,而且圖片要展示縮圖,檔案要展示列表。 我的思路是: 首先,只上傳附件照片,這個直接看ele的官方例子就行,不僅僅上傳附件照片,還同時上傳其他引數。 然後,再做上傳照片和檔案,上傳其他引數,其實也就是檔案合併。   一、上傳照片和其他引

關於圖片視訊的元件

1.upload元件 <template> <div class="uploadPicture"> <div class="imgList" v-for="(item,index) of imgList"> <

關於百度編輯器圖片視訊的具體步驟(絕對能用)

過年之後來到公司的第一件事就是整後臺的上傳圖片和視訊到圖片伺服器,也就是到指定的路勁,這個功能很實用。以前用的ckeditor,現在我給整成了百度編輯器,以下是使用方法。親測可用 我也是在網上找了好幾天的資料,說實話,好多人出現的問題都不一樣,所以導致現在網上的眾說紛紜也只

jfinal利用form表單同時圖片text

一:頁面 <form class="form-horizontal" action="/users/upload" method="post" enctype="multipart/form-data" name="myform" id="myform"><

關於thinkphp5的圖片ckeditor

        $callback = input('CKEditorFuncNum');         $upload = $_FILES['upload'];         switch($upload['error']){             case 0:/

Android——從本地相簿圖片至伺服器

android實現本地圖片上傳至服務端,只需幾步操作即可實現,下面一起看看。 首先看下效果: 主要程式碼: package com.kevin.imageuploadclient.fragment; import android.graphics

android http通過post檔案提交引數(通過拼裝協議)

HttpURLConnection conn = null; DataOutputStream outStream = null;try{           String BOUNDARY = "---------------------------7da2137580

HttpUrlConnection圖片程式碼實現

/* 上傳檔案至Server的方法 */ private void uploadFile() { String end = "\r\n"; String twoHyphens = "--"; String boundary = "**

H5 移動端圖片 視訊 頁面顯示縮圖

這是我第一次寫部落格,想要分享一下程式設計經驗,因為我也算是一個菜鳥而已,在程式設計過程中,很多問題 都是通過百度,通過CSDN裡面的各位大神分享的經驗,才得以解決的,所以我也是本著造福他人,也完善自己的意願,開始寫寫部落格,分享一下程式設計中遇到的問題及解決方法。好,廢話不