阿里雲物件儲存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,便於分析異常原因。