Android AsyncHttpClient圖片上傳
本文,主要是解決app在與後臺通訊時,如何保證欄位資訊與圖片同步上傳。
網上許多圖片上傳的實現,但筆者在開發中發現,這些並不是一個具體的流程。因此,寫此文章總結下圖片的上傳流程。
圖片上傳流程,對於大部分app來說,是最長見的操作,擁有一個具體的流程,在開發中會帶來許多方便。
流程具體如下:
1、選擇圖片(拍攝、從圖片庫選擇)
2、壓縮與本地快取,圖片需要壓縮,很容易理解,為防止OOM。而快取是儲存壓縮後的圖片,以便上傳到後臺。
2、介面呈現選擇的圖片。
3、呼叫後臺介面,上傳圖片。
4、取消上傳後或者上傳成功後,刪除快取。
解釋:
圖片呈現時,最好是先壓縮再呈現。壓縮方法網上很多,但筆者對於壓縮方法,暫未找到一個可控制壓縮後圖片大小的方法,網上大部分方法為壓縮後圖片大小不可控。
圖片壓縮了,為什麼還需要做快取,原因:
圖片上傳有許多種方法,如位元組流,Base64等。
在Android中,app與後臺通訊時,都有封裝好的通訊方法。相信許多開發者也會選擇如AsyncHttpClient這樣的類庫,實現起來簡單易用。另外,一般圖片上傳時,不會簡單的只上傳圖片,圖片可能是附加的資訊。這時,採用位元組流,Base64等方法時,會出現兩個問題,一個是怎麼把欄位資訊和圖片一起上傳,二是若分開上傳,怎麼保證欄位資訊和圖片同步。
其實,AsyncHttpClient已經有關於這些問題的解決方法,AsyncHttpClient裡,已經可以實現了上傳file,利用這個就很好的解決了上述問題。
AsyncHttpClient上傳圖片,是以file的形式上傳的,而在android中,壓縮後的圖片是Bitmap形式,所以需要反壓縮後的圖片儲存起來,以File的形式再上傳。
如以下程式碼:
String title = "title";
File file = new File(path);
RequestParams requestParams = new RequestParams();
requestParams.put("title", title);
requestParams.put("file" , file);
言歸正傳,以下是各個流程的具體實現。
一、選擇圖片
1、介面跳轉選擇圖片
//跳轉拍攝照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,101 );
//跳轉從照片庫選擇
Intent intent2 = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent2,102);
2、返回結果處理
saveImageCahce(bitmap); 該方法為快取方法,下面會寫到。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 101) {
switch (resultCode) {
case Activity.RESULT_OK:
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
//快取
saveImageCahce(bitmap);
break;
case Activity.RESULT_CANCELED:
break;
}
} else if (requestCode == 102) {
switch (resultCode) {
case Activity.RESULT_OK:
Uri uri = data.getData();
Cursor cursor = getContentResolver().query(uri, null, null,null, null);
cursor.moveToNext();
String imgPath = cursor.getString(1);
cursor.close();
Bitmap bitmap = BitmapFactory.decodeFile(imgPath);
//快取
saveImageCahce(bitmap);
break;
case Activity.RESULT_CANCELED:
break;
}
}
}
關於多圖上傳
在多圖上傳時,與單圖上傳類似,只是把單圖上加上個迴圈步驟。
不同點是,選擇圖片時。不能呼叫Android自帶的圖片選擇器,而需要另做圖片選擇。關於多圖選擇,網上很多,請自行搜尋。
這裡只需要把,多圖選擇後的結果的圖片地址,以list形式,返回就行。
注意,返回的圖片地址一定要是該圖片的絕對路徑。
程式碼如下:
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
if (arg1 == 1001) {
// 獲取返回結果中圖片地址資料
Bundle bundle = arg2.getExtras();
List<String> temp = new ArrayList<String>();
temp = bundle.getStringArrayList("files");
//迴圈
for (int i = 0; i < temp.size(); i++) {
String file_path = temp.get(i);
//生成圖片快取地址
file_path =
//獲取快取資料夾地址
//獲取檔名資訊
FileManager.getSaveImagePath()
+ file_path.substring(file_path.lastIndexOf("/") + 1,
file_path.length());
//生成資料夾
FileHelper.createDirectory(FileManager.getSaveImagePath());
//壓縮與儲存圖片
File file = new File(file_path);
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
Util util = new Util(ReleaseRentalActivity.this);
Bitmap bitmap = util.getBitmapCompression(temp.get(i));
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
out.flush();
out.close();
}
mImgFiles.add(file_path);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
refreshImages();
}
}
二、壓縮與本地快取
private void saveImageCahce(Bitmap avatar) {
CacheUtils cu = new CacheUtils();
String image_path = cu.getAvatarCache(UserInfoActivity.this, avatar);
//呈現
Bitmap bitmap = BitmapFactory.decodeFile(image_path);
mUserAvatar.setImageBitmap(bitmap);
}
生成頭像快取
/**
* 生成頭像快取
*
* @param con
* @param avatar
* @return
*/
public String getAvatarCache(Context con, Bitmap avatar) {
//圖片儲存絕對路徑
String file_path = FileManager.getSaveImagePath() + AVATAR_PATH;
//圖片儲存的資料夾
FileHelper.createDirectory(FileManager.getSaveImagePath());
File file = new File(file_path);
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
ImageFactory imageFactory = new ImageFactory(con);
//壓縮圖片並儲存
Bitmap bitmap = imageFactory.comp(avatar);
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//返回該圖片快取路徑
return file_path;
}
三、上傳圖片
以RequestParams引數,進行AsyncHttpClient訪問
String title = "title";
File file = new File(path);
RequestParams requestParams = new RequestParams();
requestParams.put("title", title);
requestParams.put("file" , file);
php後臺參考程式碼
<?php
$base_path = "./upload/";
$target_path = $base_path . basename ( $_FILES ['uploadfile'] ['name'] );
if (move_uploaded_file ( $_FILES ['uploadfile'] ['tmp_name'], $target_path )) {
$array = array (
"code" => "1",
"message" => $_FILES ['uploadfile'] ['name']
);
echo json_encode ( $array );
} else {
$array = array (
"code" => "0",
"message" => "There was an error uploading the file, please try again!" . $_FILES ['uploadfile'] ['error']
);
echo json_encode ( $array );
}
?>
四、刪除快取檔案
直接以檔案刪除方式刪除
相關推薦
Android AsyncHttpClient圖片上傳
本文,主要是解決app在與後臺通訊時,如何保證欄位資訊與圖片同步上傳。 網上許多圖片上傳的實現,但筆者在開發中發現,這些並不是一個具體的流程。因此,寫此文章總結下圖片的上傳流程。 圖片上傳流程,對於大部分app來說,是最長見的操作,擁有一個具體的流程,在開發
Android本地圖片上傳(拍照+相簿)
執行效果圖: Android端程式碼MainActivity:public class MainActivity extends Activity implements OnClickListener, OnUploadProcessListener { private static
Android簡單實現將手機圖片上傳到server中
sdk etc mov 創建 ast bmi 以及 lena ews 在本例中。將會簡單的實現安卓手機將圖片上傳到server中。本例使用到了 server端:PHP+APACHE 客戶端:JAVA 先簡單實現一下server端的上傳並測試上傳
android 使用AsyncHttpClient框架上傳文件以及使用HttpURLConnection下載文件
txt andro headers buffer ati return progress handle upload AsyncHttpClient開源框架android-async-http還是非常方便的。 AsyncHttpClient該類通經常使用在andro
android之使用GridView+仿微信圖片上傳功能(附源代碼)
相冊 ada nbu [] for round pen fromfile idt 由於工作要求最近在使用GridView完成圖片的批量上傳功能,我的例子當中包含仿微信圖片上傳、拍照、本地選擇、相片裁剪等功能,如果有需要的朋友可以看一下,希望我的實際經驗能對您有所幫助。
[寫著玩]理解multipart/form-data,構造http表單實現android圖片上傳
關於multipart/form-data,可參考https://blog.csdn.net/zshake/article/details/77985757 客戶端 引數解釋,上傳主方法 private void submit() { Map<String, Obj
Android拍照和相簿選擇圖片上傳所遇到的一些坑
微信公眾號:IT小頑童 前段時間做拍照和相簿選擇圖片上傳,遇到一些坑,最近閒來沒事,就整理一篇部落格,並寫了個demo,專案中使用純java,這次採用java + kotlin混合,GitHub的地址戳此 1、首先遇到的的是Android7.0的坑 說是坑,有點欲加
微信上傳圖片ios不能調和Android能調上傳介面的bug
問題描述:做微信公眾號的時候發現iso不能顯示,andriod裡能正常調上傳介面? 最後發現是url不一樣 // 微信config配置 initConfig() { let _this = this; let url = ""; // 判
android利用h5上傳圖片遇到的問題
由於專案需求,需要在一個h5頁面上實現圖片上傳的功能。整個流程是當點選h5然後webview會監聽到這個事件接著在android原生這部分獲取選中圖片並將圖片路徑傳回給h5頁面處理並上傳。監聽這個選擇圖片的監聽是需要去繼承一個WebChromeClient並重寫
Android從相簿中選取圖片上傳到阿里雲OSS
在開發APP軟體中,boss突然提出想在軟體中新增一個多張照片上傳的功能,作為菜鳥的我,琢磨了兩天,才弄出來,今天特地貼出來。本篇部落格主要介紹的是將本地圖片上傳到伺服器的方法技巧。主要技術點是: 一、運用第三方可以從相簿中選取多張圖片。 二、將圖片
Android實現拍照相簿圖片上傳功能
更改頭像功能不像修改資訊一樣直接提交引數就可以,需要上傳圖片檔案 我就直接貼程式碼了首先給出佈局檔案 <ImageView android:id="@+id/iv" android:layout_width="50d
Android WebView 支援H5圖片上傳
webview 在android的元件webview中是不能用H5上傳檔案了的。但是有時候我們需要用H5去呼叫上傳檔案,因此需要支援這項功能。 程式碼示例 有不同的額版本適配方法 3.0 4.0 5.0 6.0 public class Pla
H5呼叫Android圖片上傳功能
public class OpenFileWebChromeClient extends WebChromeClient { public static final int REQUEST_FILE_PICKER = 1; public ValueCallback<Uri> mF
Android模擬 HTTP multipart/form-data 請求協議資訊實現圖片上傳
轉自:http://www.linuxidc.com/Linux/2011-08/41944.htm 問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用
android 拍照本本地選擇圖片上傳
好久沒有坐下來安安靜靜的寫部落格了 ,上一篇寫的是自定義相機 ,以前專案中用過一些第三方的庫 ,萬物歸終今天找個時間總結一下 ,做開發幾年了 。隨著android studio的運用,開源資源越來越多,越來越好用 ,但是使用第三方的開原始碼,越來越不爽 ,很多庫漸漸的丟下了
Android圖片上傳到阿里雲OSS小案例
一、在阿里雲開通OOS(必須註冊有阿里雲賬戶,並開通OSS服務) 1.在管理控制檯找到OOS並開通 2.點選儲存空間,建立bucket 二、整合 1、 Android SDK開發包 Android Studio方式(推薦) M
Android前端RxJava2+Retrofit2;後端SpringMvc實現圖片上傳
前言 因為前端使用的rxjava+retrofit+mvp的架構進行實現,因此考慮著圖片上傳的功能也直接用rxjava+retrofit去實現,結果在使用過程中,發現始終有問題,圖片上不去;測試了幾天,嘗試更新成rxjava2+retrofit2進行測試
Android開發:仿微信和QQ空間發說說相簿讀取、拍照、圖片裁剪和圖片上傳伺服器等功能的實現
第一步:新增依賴包: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.1' compile project('
Android使用Retrofit技術仿微信圖片上傳,可以選擇多張圖片拍照上傳
Android 仿照微信發說說,既能實現拍照,選相簿,多圖案上傳 使用Retrofit技術。 使用方法:詳見部落格 專案的執行效果: 伺服器端接收檔案的action UploadFile.java @Controller p
Android HTTP multipart/form-data 請求協議資訊實現圖片上傳
問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用Android的HTTPConnection/ ApacheHTTP 通過POST 和GET的方式就實現不了