2015年6月21日 星期日

[擒猿筆記篇] Android 利用 Parse Cloud Server (三) ParseFile

在第一篇 [擒猿筆記篇] Android 利用 Parse Cloud Server (一) ParseObject 有稍微提到 ParserObject 可以存取的資料型別如下:
  • String
  • int
  • bool
  • ParseObject
  • java.util.Date
  • byte[]
  • JSONObject.NULL
  • JSONObject
  • JSONArray
蓦然發現,如果要上傳圖片到雲端資料庫怎麼辦?

你可能會說有 byte[] 可以用啊~ 把 binary file 轉成 byte[] 就可以惹~

幹你娘這麼簡單我還需要發這篇嗎?哥來教你專業的用法:

ParseFile

Parse API 提供了一個 ParseFile 的物件可以協助我們存取 binary file,ParseFile 可以將 Size 太大以至於不適合塞到 ParseObject 的檔案放到原端資料庫,如 images、documents、videos、music ... 等等,一次最多可放 10 MB。

用法很簡單,先將檔案以 byte[] 的形式開啟,然後存承 ParseFile,如以下寫法:
byte[] data = "Working at Parse is great!".getBytes();
ParseFile file = new ParseFile("resume.txt", data);
這樣會把資料以檔名 "resume.txt" 的形式儲存。

上傳 ParseFile

上傳 ParseFile 的方式跟 ParseObject 很像,如以下寫法:
file.saveInBackground();
當執行完畢後,便可將 ParseFile 與 ParseObject 做一個連結,寫法如下:
ParseObject jobApplication = new ParseObject("JobApplication");
jobApplication.put("applicantName", "Joe Smith");
jobApplication.put("applicantResumeFile", file);
jobApplication.saveInBackground();

將檔案轉成 byte[] 可參考以下寫法
File file = new File(file_path);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
    for (int readNum; (readNum = fis.read(buf)) != -1;) {
        bos.write(buf, 0, readNum); //no doubt here is 0
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
byte[] fileInBytes = bos.toByteArray();
bos.close();
fis.close();

下載 ParseFile

從雲端資料庫下載 ParseFile 的方式如下,利用 getData() 取回該檔案的 byte[] 陣列:
ParseFile applicantResume = (ParseFile)anotherApplication.get("applicantResumeFile");
applicantResume.getDataInBackground(new GetDataCallback() {
  public void done(byte[] data, ParseException e) {
    if (e == null) {
      // data has the bytes for the resume
    } else {
      // something went wrong
    }
  }
});

進度條

上傳或下載 ParseFile 的進度,可以透過以下方式取得:
byte[] data = "Working at Parse is great!".getBytes();
ParseFile file = new ParseFile("resume.txt", data);

file.saveInBackground(new SaveCallback() {
  public void done(ParseException e) {
    // Handle success or failure here ...
  }
}, new ProgressCallback() {
  public void done(Integer percentDone) {
    // Update your progress spinner here. 
    // percentDone will be between 0 and 100.
  }
});

刪除雲端資料庫上的檔案

欲刪除雲端資料庫上的檔案,必須透過 REST API (https://www.parse.com/docs/rest/guide/#files)
其中 delete file 的指令需要該 App 的 master key,如下:
curl -X DELETE \
  -H "X-Parse-Application-Id: xxxxx" \
  -H "X-Parse-Master-Key: yyyyy" \
  https://api.parse.com/1/files/...profile.png
其中 xxxxx 與 yyyyy 為帳號與 App 綁定的 master key




沒有留言:

張貼留言