phonegap file api

https://github.com/chrisben/imgcache.js/tree/master/examplesjavascript

 

1.FILE APIphp

file api最大的兩個功能是download和upload,download最經常使用的需求是把服務器的圖片本地化到手機上,實現離線web app也能夠瀏覽圖片的功能。upload能夠實現把本地圖片上傳到服務器的需求,若是項目涉及到發佈圖片,修改頭像等需求,這個API就必須用到了html

FileTransfer.download 經驗:前端

download服務器的圖片相信不少人已經實現了,phonegap也有很完整的demo,可是對於已經download到手機上的圖片,怎麼再次從本地file取出來顯示,是最爲關鍵的。首先咱們要知道的是,img標籤也能顯示本地的圖片文件,例如java

<img class="border_img" src="http://www.mansonchor.com/images/img_loading.gif" data-original="file://xxxxx.jpg">

那麼只要咱們能夠得到已download圖片的本地路徑就能夠了。要想把圖片的服務器路徑和本地路徑作成一一對應,辦法有不少,而我是使用md5 hash的方式。android

具體流程是,當我想顯示一張服務器圖片,例如圖片地址是  http://www.mansonchor.com/image.jpg 時,我把 http://www.mansonchor.com/image.jpg作md5算法,得出md5後的字符串,而後在本地文件夾裏查找是否已經存在以這個md5串命名的圖片,假若有,證實以前這張圖片已經download到本地了,能夠直接把這張圖片的本地路徑賦值給img的src顯示;假如沒有,證實這張圖片還沒被download到本地,就調用phonegap的FileTransfer.download接口把圖片下載到手機上,固然這張本地圖片的命名要以這個md5串同樣。git

由於md5過的圖片地址,和本地的圖片文件名是一一對應並且是惟一的,這樣咱們就能夠實現圖片本地化的需求了。github

固然了,上面說的查找本地文件、download時自定義文件名、獲取本地文件的本地路徑,在phonegap中都有對應的方法。而md5算法,javascript自己並無提供,須要本身寫或去網上搜一下現成的。web

下面是我作圖片本地化的代碼算法

function local_the_img(img_url,img_obj,after_loaded)
{
    self = this;
 
    //處理開始
    var img_url = img_url;
    var img_obj = img_obj;
 
    var url_md5 = md5(img_url);
    //var file_name = url_md5.substr(-2,2);
    var file_name = "cache_images";
 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFSSuccess, onError);
 
    //文件系統回調函數
    function onFSSuccess(fileSystem)
    {
      //取本機圖像
      fileSystem.root.getFile(file_name+"/"+url_md5+".jpg",null,
      //若是有,直接拿出來顯示
      function(FileEntry){
 
        after_loaded.call(self,img_obj,FileEntry.toURI());
        //$(img_obj).attr('src',FileEntry.toURI());
      },
      //無的話,下載落來再顯示
      function(){
 
          fileSystem.root.getDirectory(file_name,{create:true},gotDir,onError);
      });
    }
 
    function gotDir(DATADIR)
    {
      var ft = new FileTransfer();
      var dlPath = DATADIR.fullPath + "/" + url_md5 + ".jpg";
 
      ft.download(img_url, dlPath, 
      function(e){
     
        after_loaded.call(self,img_obj,e.fullPath);
        //$(img_obj).attr('src',e.fullPath);
      }, 
      function(e){
         
        console.log("ERROR");
        console.log(JSON.stringify(e));
 
      });
    }
 
    function onError(e)
    {
      console.log("ERROR");
      console.log(JSON.stringify(e));
    }
   
}

說明一下,getDirectory方法裏面{create:true}這個參數必需要傳,做用是在本地找不到這個文件時,自動建立這個文件,在android裏面download的圖片不能直接建立文件,必須先建立了再寫入。after_loaded是回調方法,把得到的本地圖片路徑和對應的img對象做參數回調,方便外層調用。

FileTransfer.upload 經驗:

var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=fileURI.substr(fileURI.lastIndexOf('/')+1);
options.mimeType="text/plain";
 
var params = new Object();
params.value1 = "test";
params.value2 = "param";
 
options.params = params;
 
var ft = new FileTransfer();
ft.upload(fileURI, "http://some.server.com/upload.php", win, fail, options);

在phonegap的demo裏,前端代碼已經很清楚,就很少說了,可是它卻沒有提供upload.php的demo,不少人都不清楚圖片究竟是用什麼方式提交的。

其實upload接口的圖片提交,就和咱們日常用form去提交的方式是同樣的,仍是不具體?看代碼吧

<form action="http://some.server.com/upload.php" method="post">
    <input type="file" name="file">
    <input type="hidden" name="value1" value="test">
    <input type="hidden" name="value2" value="param">
</form>

就是說上面phonegap的代碼,和下面form的html代碼提交到upload.php的效果,是一摸同樣的。我還特地用抓包軟件看了下,其實phonegap的FileTransfer.upload 就是徹底模擬一個POST的請求。

至於服務器端怎麼處理圖片的上傳,那就須要本身去部署了。

2. Camera API

camera api就是能讓你調用本機的攝像頭或者調用本地的相冊來獲取圖片,這個API通常配合着FileTransfer.upload來使用。建議儘可能使用FILE_URI而不是DATA_URL的返回方式,由於DATA_URL是一個至關龐大的base64字符串,對於高像素的手機,高質量圖片的DATA_URL頗有可能讓你的app閃退。

用FILE_URI返回的圖片,在upload時不少時候會有圖片方向的問題,明明我是直立的照片,上傳到服務器以後會變成打橫的了,這個問題困擾了我好久,最後發現是因爲圖片的exif引發的。(exif是什麼?

exif其中有一個屬性記錄了圖片的旋轉角度,在服務器你能夠獲取上傳的這張圖片的exif,再根據這個屬性來進行方向的調整。

PHP裏可使用exif_read_data函數來獲取圖片的exif

$img_info = exif_read_data( $source , ANY_TAG  );
switch( $img_info['Orientation'] )
{
    case 6:
      $r = 270;
      break;
                         
    case 3:
      $r = 180;
      break;
                         
    case 8:
      $r = 90;
      break;
                         
    default:
      $r = 0;
}

若是你不想在服務器上作過多的處理,也有一個快捷的辦法,就是在調用camera api時,加上correctOrientation參數,加上這個參數後,phonegap會自動在本地幫你調整,不過這個參數只有在phonegap 1.7版才支持,並且只針對iphone有效。

另外還有個問題就是quality千萬不要設得過高,phonegap上建議iphone把quality調到50如下,可是我在用4S調試時,就算把quality調到20,都常常會閃退,升級到phonegap 1.7以後狀況有改善,可是有時app運行久了照相仍是會閃退,相信是phonegap對內存的控制作得仍是不夠好。

等之後對其它api有更多經驗時,再發文補充

 

引自:http://www.mansonchor.com/blog/blog_detail_63.html

 

http://stackoverflow.com/questions/21941731/cordova-phonegap-open-downloaded-file-inappbrowser

相關文章
相關標籤/搜索