1. 程式人生 > >七牛上傳圖片初探 開始上傳 暫停上傳 繼續上傳

七牛上傳圖片初探 開始上傳 暫停上傳 繼續上傳

效果



程式碼

public class MainActivity extends AppCompatActivity {

    ListView listview;
    AlbumList albumList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        initView();
    }

    private void initData() {
        List<AlbumList.ImgListBean> list = new ArrayList<>();
        
        for (int i = 0; i < 3; i++) {
            List<String> pictures = ImgHandleUtils.getPictures(Environment.getExternalStorageDirectory() + "/新資料夾");
            AlbumList.ImgListBean imgListBean = new AlbumList.ImgListBean();
            imgListBean.setImgUrlList(pictures);
            imgListBean.setDirName("金地小城");
            list.add(imgListBean);
        }

        albumList = new AlbumList();
        albumList.setImgList(list);
    }

    private void initView() {
        listview = (ListView) findViewById(R.id.listview);
        ListViewAdapter adapter = new ListViewAdapter(this, albumList.getImgList());
        listview.setAdapter(adapter);
    }
}

public class ListViewAdapter extends BaseAdapter {

    private Context mContext;
    private List<AlbumList.ImgListBean> imgList;
    //指定upToken, 強烈建議從服務端提供get請求獲取, 這裡為了演示直接指定key
    private static String uptoken = "um6IEH7mtwnwkGpjImD08JdxlvViuELhI4mFfoeL:NCnWTr1D3jR_9_dxj6geIgPBQq4=:eyJzY29wZSI6ImFuZHJvaWRkZW1vIiwiZGVhZGxpbmUiOjIzMDk5MjE5MTIsInJldHVybkJvZHkiOiJ7IFwiaGFzaFwiOiQoZXRhZyksXCJrZXlcIjokKGtleSksXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0=";
    private UploadManager uploadManager;  //七牛SDK的上傳管理者
    private UploadOptions uploadOptions;  //七牛SDK的上傳選項
    private UpProgressHandler upProgressHandler;  //七牛SDK的上傳進度監聽
    private UpCancellationSignal upCancellationSignal;  //七牛SDK的上傳過程取消監聽
    private boolean isProgressCancel = false;  //網路請求過程中是否取消上傳或下載

    public ListViewAdapter(Context context, List<AlbumList.ImgListBean> imgList) {
        this.mContext = context;
        this.imgList = imgList;
    }

    @Override
    public int getCount() {
        return imgList.size();
    }

    @Override
    public Object getItem(int i) {
        return imgList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        final ViewHolder holder;
        if (view == null) {
            view = LayoutInflater.from(mContext).inflate(R.layout.listview_item, viewGroup, false);
            holder = new ViewHolder();
            holder.item_img = view.findViewById(R.id.item_img);
            holder.item_tv_name = view.findViewById(R.id.item_tv_name);
            holder.item_tv_count = view.findViewById(R.id.item_tv_count);
            holder.probar_upload = view.findViewById(R.id.probar_upload);
            holder.tv_progress = view.findViewById(R.id.tv_progress);
            holder.tv_upload = view.findViewById(R.id.tv_upload);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        final AlbumList.ImgListBean imgListBean = imgList.get(i);
        Glide.with(mContext)
                .load(new File(imgListBean.getImgUrlList().get(0)))
                .placeholder(R.mipmap.ic_launcher)
                .into(holder.item_img);
        holder.item_tv_name.setText(imgListBean.getDirName());
        holder.item_tv_count.setText(imgListBean.getImgUrlList().size() + "");

        holder.tv_upload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.tv_upload.getText().equals("上傳")) {
                    holder.tv_upload.setText("暫停");
                    //開始上傳
                    holder.probar_upload.setMax(imgListBean.getImgUrlList().size());
                    if (!isInitUpload) {
                        initUpload();
                    }
                    upload(imgListBean.getImgUrlList(), holder.probar_upload, holder.tv_progress, holder.tv_upload);
                } else if (holder.tv_upload.getText().equals("暫停")) {
                    holder.tv_upload.setText("繼續");
                    //暫停上傳
                    isProgressCancel = true;
                    Toast.makeText(mContext, (currentIndex + ""), Toast.LENGTH_SHORT).show();
                } else if (holder.tv_upload.getText().equals("繼續")) {
                    holder.tv_upload.setText("暫停");
                    //繼續上傳
                    Toast.makeText(mContext, (currentIndex + ""), Toast.LENGTH_SHORT).show();
                    isProgressCancel = false;
                    upload(imgListBean.getImgUrlList(), holder.probar_upload, holder.tv_progress, holder.tv_upload);
                }
            }
        });
        return view;
    }

    private int currentIndex = 0;//當前上傳到第幾張照片,預設從0開始
    private boolean isInitUpload = false;

    /**
     * 上傳方法
     *
     * @param imgUrlList    單個相簿的圖片路徑集合
     * @param probar_upload
     * @param tv_progress
     */
    private void upload(final List<String> imgUrlList, final ProgressBar probar_upload, final TextView tv_progress, final TextView tv_upload) {
        uploadManager.put(new File(imgUrlList.get(currentIndex)), null, uptoken, new UpCompletionHandler() {
            /**
             * 主執行緒執行
             *
             * @param key      UploadManager.put()方法中指定的key,也就是上傳到七牛伺服器上的檔名;
             * @param info     Json串表示的上傳資訊,包括使用版本,請求狀態,請求Id等資訊;
             * @param response Json串表示的檔案資訊,包括檔案Hash碼,儲存在七牛服務的key,檔案Mime型別,檔案大小等資訊,具體欄位取決上傳策略的設定;
             */
            @Override
            public void complete(String key, ResponseInfo info, JSONObject response) {
                if (info.isOK()) {
                    Log.e("QINIULOG:", key + "!\n" + info + "!\n" + response + "!");
                    currentIndex++;
                    probar_upload.setProgress(currentIndex);
                    tv_progress.setText(currentIndex + "/" + imgUrlList.size());
                    if (currentIndex < imgUrlList.size()) {
                        upload(imgUrlList, probar_upload, tv_progress, tv_upload);//遞迴上傳
                    } else {
                        currentIndex = 0;//重置
                        tv_upload.setText("上傳完成");
                    }
                } else {
                    Log.e("QINIULOG:", "上傳失敗:" + info.statusCode);
                }
            }
        }, uploadOptions);
    }

    private static class ViewHolder {
        private ImageView item_img;
        private TextView item_tv_name;
        private TextView item_tv_count;
        private ProgressBar probar_upload;
        private TextView tv_progress;
        private TextView tv_upload;
    }

    /**
     * 初始化上傳配置,只需初始化一次就可以
     */
    private void initUpload() {
        isInitUpload = true;
        uploadManager = new UploadManager();
        upProgressHandler = new UpProgressHandler() {
            /**
             * 主執行緒執行
             * @param key 上傳時的upKey;
             * @param percent 上傳進度;
             */
            @Override
            public void progress(String key, double percent) {
                //上傳進度相關
            }
        };
        upCancellationSignal = new UpCancellationSignal() {
            @Override
            public boolean isCancelled() {
                //控制取消上傳,取消之後就不能再上傳了
                return isProgressCancel;
            }
        };
        //定義資料或檔案上傳時的可選項
        uploadOptions = new UploadOptions(
                null,  //擴充套件引數,以x:開頭的使用者自定義引數
                "mime_type",  //指定上傳檔案的MimeType
                true,  //是否啟用上傳內容crc32校驗
                upProgressHandler,  //上傳內容進度處理
                upCancellationSignal  //取消上傳訊號
        );
    }
}

上傳成功後七牛返回的資訊

ResponseInfo info 資訊
	{ver:7.3.10,
	ResponseInfo:1507880162533195,
	status:200,
	reqId:a30AAJ89bN4BEe0U,
	xlog:body:1;s.ph;s.put.tw;s.put.tr:2;s.put.tw;s.put.tr:5;s.ph;PFDS:5;PFDS:7;rs36_16.sel:4/not found;rdb.g:1/no such key;DBD:1/404;v4.get:1/Document not found;rs36_16.ins:9;rwro.ins:15;RS:16;rs.put:16;rs-upload.putFile:24;UP:28, 
	xvia:bc488,
	vdn-jssz-mob-1-6,
	host:upload.qiniup.com,
	path:/,
	ip:xxxxxxx,
	port:80,
	duration:214 s,
	time:1507880164,
	sent:233531,
	error:null}

JSONObject response 資訊
	{"hash":"Fsu2LPwvk331ltLR50VLT2FHpFxB",
	"key":"Fsu2LPwvk331ltLR50VLT2FHpFxB",
	"mimeType":"image\/jpeg",
	"fsize":232869}

注意事項:

七牛對上傳的圖片做了限制,當圖片大於4M的時候,會自動使用斷點上傳,上傳過程會比較慢,如果小於4M,會使用Form上傳,速度比較快。所以如果允許的話儘量將圖片大小控制在4M以內,方便上傳。