Titanium - 将远程映像保存到文件系统

时间:2017-01-15 21:06:27

标签: titanium appcelerator appcelerator-titanium

我正在构建一个带有钛的应用程序,我想保存在手机中,用户的个人资料图片。在我的登录功能中,在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);

但图像没有出现。有人能帮助我吗?

非常感谢:)

2 个答案:

答案 0 :(得分:2)

您的代码有两个问题:

1 - 您不能使用 toImage()方法,除非您的图像视图在UI堆栈上呈现或仅在显示时呈现。相反,你应该使用 toBlob()方法。

2 - 点号。 1也不会按照您使用的方式工作,因为您不能直接使用 toBlob()方法,直到或者除非网址中的图像被完全加载,这意味着它将在图像视图中显示。要检查图片的加载时间,请使用 Ti.UI.ImageView onload event

但是,还有另一种更好的方法来完成这类任务。

由于您有来自Login API响应的图片网址,因此您可以使用此网址从http客户端调用中获取图片,如下所示:

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();
}

答案 1 :(得分:-1)

您无需手动缓存远程图像,因为

  

远程图像会自动缓存在iOS平台上,从那时起   在Android平台上发布3.1.0。

[see docs here& credit to Fokke Zandbergen]

只需在您的用户界面中使用远程图像网址,首先访问Titanium将为您下载并缓存它;下一次访问同一图像的URL实际上将在本地设备上的自动缓存版本上(没有代码是最佳代码)

H个。