2017-01-15 5 views
1

티타늄으로 앱을 제작 중이며 전화, 사용자 프로필 사진을 저장하고 싶습니다. 내 로그인 기능으로, API 응답 후에, 나는하려고 노력 :티타늄 - 파일 시스템에 원격 이미지 저장

Ti.App.Properties.setString("user_picture_name", res.profil_picture); 
var image_to_save = Ti.UI.createImageView({image:img_url}).toImage(); 
var picture = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, res.profil_picture); //As name, the same as the one in DB 
picture.write(image_to_save); 

내가 이미지를 표시하고자하는 뷰 :

var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,Ti.App.Properties.getString("user_picture_name")); 

var image = Ti.UI.createImageView({ 
    image:f.read(), 
    width:200, 
    height:100, 
    top:20 
}); 
main_container.add(image); 

그러나 이미지가 표시되지 않습니다. 누군가 나를 도울 수 있습니까?

고마워요 :)에 수동으로 원격 이미지를 캐시 할 필요가 없습니다

답변

1

는 코드 2 문제가 있습니다

1 - 이미지보기가 UI 스택 또는 단순히 화면에 렌더링하지 않는 한 당신은 toImage() 방법을 사용할 수 없습니다. 오히려 toBlob() 메소드를 사용해야합니다.

2 - 포인트 넘버. 1은 (는) toBlob() 메소드를 URL의 이미지가 완전히로드되지 않을 때까지 직접 사용할 수 없기 때문에 사용중인 방식대로 작동하지 않습니다. 이는 이미지보기에 표시 될 때까지 의미합니다. 이미지가로드 될 때를 확인하려면 Ti.UI.ImageView onload event

을 사용하십시오. 그러나 이러한 유형의 작업을 수행하는 더 좋은 방법이 있습니다.

당신이 당신의 로그인 API 응답에서 이미지 URL을 가지고 있기 때문에,이 같은 HTTP 클라이언트 호출에서 이미지를 가져 오기 위해이 URL을 사용할 수 있습니다

function fetchImage() { 
    var xhr = Ti.Network.createHTTPClient({ 
     onerror : function() { 
      alert('Error fetching profile image'); 
     }, 

     onload : function() { 
      // this.responseData holds the binary data fetched from url 
      var image_to_save = this.responseData; 

      //As name, the same as the one in DB 
      var picture = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, res.profil_picture); 
      picture.write(image_to_save); 

      Ti.App.Properties.setString("user_picture_name", res.profil_picture); 

      image_to_save = null; 
     } 
    }); 

    xhr.open("GET", img_url); 
    xhr.send(); 
} 
+0

잘 작동합니다! 고마워요 Prashant Saini : –

+0

당신은 정확한 답변을 표시하여 Prashant를 신용하고 다른 사용자가 앞으로 해결할 솔루션을 찾을 수 있도록 도와야합니다. :) –

-1

,

원격 이미지 릴리스 3.1.0 이후, 아이폰 OS 플랫폼에서 자동으로 캐시되어 있기 때문에, 안드로이드 플랫폼.

[see docs here & credit to Fokke Zandbergen]

그냥 티타늄 다운로드하고 당신을 위해 그것을 캐시합니다 첫번째 접근에서, 당신의 UI에 원격 이미지 URL을 사용; 동일한 이미지 URL에 대한 다음 액세스는 실제로 로컬 장치의 자동 캐시 된 버전에 있습니다 (코드는 최상의 코드가 아닙니다)

Hth.

+0

이 솔루션은 수정 URL의 경우에만 작동합니다. 이미지 URL이 변경되면 작동하지 않습니다. –

+0

잘, 나는 언급의 가치가 있었다고 생각했다. 감사합니다 downvote –

+0

그래, 언급하는 것이 좋았지 만,이 질문의 맥락에서 아니었고 우리는 항상 사용자가 물어 보지 않은 다른 것을 언급하는 대신 실제 질문에 직접 대답하려고 노력해야한다. 그는 저장소에 그림을 저장하고 싶다고 말했기 때문에 자르기, 크기 조정 등을 업데이트하는 것과 같은 이미지를 사용하게됩니다. :) –