1. 程式人生 > >Android AsyncHttpClient圖片上傳

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的方式就實現不了