Android開發中有很多情況下,需要實作向伺服器上傳圖檔,比如說開發APP過程需要實作上傳頭像等資訊。這篇文章給出了Android終端上傳頭像圖檔的方法與簡析。
上傳工具類:
[java] view plain copy print?
- 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.UUID;
- public class UploadUtils {
- private static final String TAG = "upload";
- private static final int TIME_OUT = 1000 * 1000; // 逾時時間
- private static final String CHARSET = "utf-8"; // 設定編碼
- public static String uploadFile(File file, String RequestURL) {
- String result = null;
- String BOUNDARY = UUID.randomUUID().toString(); // 邊界辨別 随機生成
- String PREFIX = "--", LINE_END = "\r\n";
- String CONTENT_TYPE = "multipart/form-data"; // 内容類型
- 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("Content-Type", CONTENT_TYPE + ";boundary="
- + BOUNDARY);
- if (file != null) {
- DataOutputStream dos = new DataOutputStream(
- conn.getOutputStream());
- StringBuffer sb = new StringBuffer();
- sb.append(PREFIX);
- sb.append(BOUNDARY);
- sb.append(LINE_END);
- sb.append("Content-Disposition: form-data; name=\"upload\"; filename=\""
- + file.getName() + "\"" + LINE_END);
- sb.append("Content-Type: application/octet-stream; charset="
- + CHARSET + LINE_END);
- sb.append(LINE_END);
- dos.write(sb.toString().getBytes());
- InputStream is = new FileInputStream(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();
- int res = conn.getResponseCode();
- // 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();
- System.out.println(result);
- // if(res==200)
- // {
- // }
- // else{
- // Log.e(TAG, "request error");
- // }
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- }
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.UUID;
/**
*
* 上傳工具類
*
*/
public class UploadUtils {
private static final String TAG = "upload";
private static final int TIME_OUT = 1000 * 1000; // 逾時時間
private static final String CHARSET = "utf-8"; // 設定編碼
/**
* android上傳檔案到伺服器
*
* @param file
* 需要上傳的檔案
* @param RequestURL
* 請求的rul
* @return 傳回響應的内容
*/
public static String uploadFile(File file, String RequestURL) {
String result = null;
String BOUNDARY = UUID.randomUUID().toString(); // 邊界辨別 随機生成
String PREFIX = "--", LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; // 内容類型
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("Content-Type", CONTENT_TYPE + ";boundary="
+ BOUNDARY);
if (file != null) {
/**
* 當檔案不為空,把檔案包裝并且上傳
*/
DataOutputStream dos = new DataOutputStream(
conn.getOutputStream());
StringBuffer 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=\"upload\"; filename=\""
+ file.getName() + "\"" + LINE_END);
sb.append("Content-Type: application/octet-stream; charset="
+ CHARSET + LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes());
InputStream is = new FileInputStream(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();
// 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();
System.out.println(result);
// if(res==200)
// {
// }
// else{
// Log.e(TAG, "request error");
// }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
圖檔上傳封裝類:
[java] view plain copy print?
- import java.io.File;
- import android.os.Environment;
- public class TUploadFile {
- private static TUploadFile mTUploadFile = null;
- private TUploadFile() {
- }
- public synchronized static TUploadFile getInstance() {
- if (mTUploadFile == null)
- mTUploadFile = new TUploadFile();
- return mTUploadFile;
- }
- public String TUploadHeadImage(String cusId) {//使用者ID号,上傳頭像,一個使用者對應一個頭像
- String result = "";
- //比如說通過拍照裁剪後先儲存在本地命名為myphoto.png,然後從本地上傳到伺服器上
- result = UploadUtils.uploadFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/myphoto.png"),"伺服器域名" + cusId);
- return result;
- }
- }
import java.io.File;
import android.os.Environment;
public class TUploadFile {
private static TUploadFile mTUploadFile = null;
private TUploadFile() {
}
public synchronized static TUploadFile getInstance() {
if (mTUploadFile == null)
mTUploadFile = new TUploadFile();
return mTUploadFile;
}
public String TUploadHeadImage(String cusId) {//使用者ID号,上傳頭像,一個使用者對應一個頭像
String result = "";
//比如說通過拍照裁剪後先儲存在本地命名為myphoto.png,然後從本地上傳到伺服器上
result = UploadUtils.uploadFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/myphoto.png"),"伺服器域名" + cusId);
return result;
}
}
APP應用中儲存全局變量的Application類:
[java] view plain copy print?
- public class TestApplication extends Application {
- private static TestApplication mInstance = null;
- public static TUploadFile mTUploadFile;
- // 單例模式中擷取唯一的TestApplication執行個體
- public static TestApplication getInstance() {
- if (null == mInstance)
- mInstance = new TestApplication();
- return mInstance;
- }
- public void onCreate() {
- super.onCreate();
- mTUploadFile = TUploadFile.getInstance();
- }
- }
public class TestApplication extends Application {
private static TestApplication mInstance = null;
public static TUploadFile mTUploadFile;
// 單例模式中擷取唯一的TestApplication執行個體
public static TestApplication getInstance() {
if (null == mInstance)
mInstance = new TestApplication();
return mInstance;
}
public void onCreate() {
super.onCreate();
mTUploadFile = TUploadFile.getInstance();
}
}
采用異步方式進行上傳頭像圖檔的方法:
[java] view plain copy print?
- public class AsyncHeadUpTask extends AsyncTask<String, Integer, String> {
- // 上傳頭像
- protected String doInBackground(String... params) {
- String code = "";
- try {
- String result = TestApplication.mTUploadFile.TUploadHeadImage(params[0]);//參數為使用者ID
- JSONObject resultCode = new JSONObject(result);
- code = resultCode.getString("commonACK");//伺服器端傳回的驗證碼
- } catch (Exception e) {
- e.printStackTrace();
- }
- return code;
- }
- protected void onPostExecute(String result) {
- stopProgressDialog();//上傳成功後停止延遲動畫
- if (result.equals("111111")) {// 伺服器傳回來的驗證碼為111111時表示上傳頭像成功
- Toast.makeText(getActivity(), "上傳頭像成功", Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(getActivity(), "網絡連接配接錯誤", Toast.LENGTH_SHORT).show();
- }
- }
- protected void onPreExecute() {
- super.onPreExecute();
- startUpProgressDialog();//上傳延時動畫
- }
- }
public class AsyncHeadUpTask extends AsyncTask<String, Integer, String> {
// 上傳頭像
protected String doInBackground(String... params) {
String code = "";
try {
String result = TestApplication.mTUploadFile.TUploadHeadImage(params[0]);//參數為使用者ID
JSONObject resultCode = new JSONObject(result);
code = resultCode.getString("commonACK");//伺服器端傳回的驗證碼
} catch (Exception e) {
e.printStackTrace();
}
return code;
}
protected void onPostExecute(String result) {
stopProgressDialog();//上傳成功後停止延遲動畫
if (result.equals("111111")) {// 伺服器傳回來的驗證碼為111111時表示上傳頭像成功
Toast.makeText(getActivity(), "上傳頭像成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "網絡連接配接錯誤", Toast.LENGTH_SHORT).show();
}
}
protected void onPreExecute() {
super.onPreExecute();
startUpProgressDialog();//上傳延時動畫
}
}
主Acitivty檔案裡調用上面的異步上傳頭像圖檔的方法即可實作向伺服器上傳頭像的功能。