1. 程式人生 > >阿里雲物件儲存OSS--實現隨時隨地上傳檔案到阿里雲

阿里雲物件儲存OSS--實現隨時隨地上傳檔案到阿里雲

需求背景:消費者多批次回饋我司生產的車載智慧後視鏡出現宕機、連不上伺服器等問題,因產品已經出到全國各地不方便去取異常log,也不可能要求消費者把log傳給我們分析。

需求目標:公司內部實現遠端後臺上傳問題機型的log。

必備條件:後視鏡有SIM卡且能夠聯網(遠端控制需要聯網)、問題後視鏡的IMEI號((=International Mobile Equipment Identity)

過程有點曲折,下文我儘量描述的詳細些方便大家實現類似的需求。
其它的雲端儲存我都試過,要麼關閉了開發者模式,要麼開發文件不全面,最終選擇了阿里雲。

一、阿里雲端準備工作
1、註冊阿里雲賬戶

2、登入賬戶進入阿里雲平臺,點選左上角控制檯

這裡寫圖片描述

3、進入控制檯後點擊右上角“產品與服務”,然後分別開通“物件儲存OSS”和“訪問控制”

這裡寫圖片描述

4、物件儲存OSS:開通後需要購買流量包,我買的是5塊錢40G/使用6個月,還需要建立資料夾,注意購買流量包和建立檔案有個區域選擇,填你所在的區域,完成後如下圖

這裡寫圖片描述

5、訪問控制: 訪問控制開通後需要建立使用者,生成accessKeyId和accessKeySecret,這兩個KEY儲存起來後面程式中要用

這裡寫圖片描述

二、安卓程式碼部分

1、下載阿里雲demo,按下圖步驟

這裡寫圖片描述

點選支援——API

這裡寫圖片描述

點選“開放了API產品”

這裡寫圖片描述

進入後可以看到開發列表幾十項,看的很煩躁,我直接下它的demo來除錯,找到下圖箭頭位置,sample目錄,點選檢視裡面是GitHub程式碼例子,直接下載出來

這裡寫圖片描述

2、調整程式碼,demo裡面有個MainActivity,程式碼調整如下,實現了遍歷資料夾,上傳資料夾全部檔案

public class MainActivity extends Activity {
    private OSS oss;

    // 執行sample前需要配置以下欄位為有效的值
    private static final String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";//固定,我所在地域是華南,城市要改成shenzhen
    private static final String accessKeyId = "LTAIboGV8y0e"
;//固定 private static final String accessKeySecret = "Z1S5Nzi4XnzgtYihPQeQB165";//固定 private static final String testBucketName = "jimi0208";//上傳到 ALi OSS 中的資料夾名字,固定命名 private static final String uploadFilePath = "/storage/sdcard0/C6Log/CarRecorderLog/"; private static final String TAG = "MainActivity==="; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret); ALiApplication.saveLogFile(TAG + credentialProvider+"====="+credentialProvider.toString()); ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(15 * 1000); // 連線超時,預設15秒 conf.setSocketTimeout(15 * 1000); // socket超時,預設15秒 conf.setMaxConcurrentRequest(5); // 最大併發請求書,預設5個 conf.setMaxErrorRetry(2); // 失敗後最大重試次數,預設2次 OSSLog.enableLog(); oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf); try { Log.i(TAG, "uploadFilePath : " + uploadFilePath); File uploadFile = new File(uploadFilePath); InputStream input = new FileInputStream(uploadFile); long fileLength = uploadFile.length(); ALiApplication.saveLogFile(TAG + "fileLength:"+fileLength); Log.i(TAG, "fileLength : " + fileLength); } catch (Exception e) { e.printStackTrace(); } // 上傳 final ArrayList<String> listFileName = new ArrayList<String>(); final String dvrPath = Environment.getExternalStorageDirectory().getPath()+"/C6Log/CarRecorderLog/";//這個路徑根據自己的要上傳的路徑修改 Log.i(TAG, "dvrPath" + dvrPath);//此處加列印檢視路徑是否正確 getAllFileName(dvrPath,listFileName); Button upload = (Button) findViewById(R.id.upload); upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { int count = 0 ; for(String uploadObj:listFileName){//迴圈資料夾 Log.i(TAG, "run()++=listFileName: " + listFileName.get(count)); ALiApplication.saveLogFile(TAG + listFileName.toString()); String uploadObject = listFileName.get(count);//第一次是獲取list 0位置的檔名 if(uploadObject != null){ new PutObjectSamples(oss, testBucketName, uploadObject, dvrPath + uploadObject).asyncPutObjectFromLocalFile(); } count++;//count每次加一 } } }).start(); } }); } public static void getAllFileName(String path, ArrayList<String> fileName) { File file = new File(path); if (!file.exists()) { return; } File[] files = file.listFiles(); ALiApplication.saveLogFile(TAG + "getAllFileName:"+ path); ALiApplication.saveLogFile(TAG + "getAllFileName:"+ files); String[] names = file.list(); ALiApplication.saveLogFile(TAG + "getAllFileName:"+ names); if (names != null){ fileName.addAll(Arrays.asList(names)); } if (files != null){ for (File a : files) { if (a.isDirectory()) { getAllFileName(a.getAbsolutePath(), fileName); } } }else{ ALiApplication.saveLogFile(TAG + "files====null"); } } }

// 執行sample前需要配置以下欄位為有效的值
private static final String endpoint = “http://oss-cn-shenzhen.aliyuncs.com“;//固定,我所在地域是華南,城市要改成shenzhen
private static final String accessKeyId = “LTAIboGV8y0e”;//固定
private static final String accessKeySecret = “Z1S5Nzi4XnzgtYihPQeQB165”;//固定
private static final String testBucketName = “jimi0208”;//上傳到 ALi OSS 中的資料夾名字,固定命名
這幾個值需要調整
第一個不同的地區要改不同的城市
第二、三個值是“訪問控制”裡面建立的使用者KEY
第四個值是“物件儲存OSS”中建立的資料夾

3、上傳完成後如下圖,我上傳的是.txt檔案,可以直接獲取地址開啟連結來檢視
這裡寫圖片描述

完整的程式碼下載地址:阿里雲OSS儲存
也可以直接聯絡我QQ:1715499699

最後,demo的程式碼只是實現了上傳功能,要實現客戶端遠端上傳log需要將demo改造成一個Service,配置開機自啟。當客戶反饋某個IMEI號的機器出現問題時,我們給這IMEI號的機器推送一個上傳log的指令,實現遠端上傳log,便於分析異常原因。