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

Titanium 钛-将远程映像保存到文件系统,titanium,appcelerator,appcelerator-titanium,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.Filesyste

我正在用钛制作一个应用程序,我想把用户的个人资料图片保存在手机中。在我的登录函数中,在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);
但是图像没有出现。有人能帮我吗


非常感谢:)

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

远程映像在iOS平台上自动缓存,并且自 在Android平台上发布3.1.0版

[&]

只需在您的UI中使用远程图像url,首先access Titanium会为您下载并缓存它;对同一图像url的下一次访问实际上将在本地设备上的自动缓存版本上进行(没有代码是最好的代码)


Hth.

您的代码有两个问题:

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

2-第1点也不会像您使用的那样工作,因为在url中的图像完全加载之前,即在图像视图上显示之前,您无法直接使用toBlob()方法。要检查图像何时加载,请使用

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

由于您有来自登录API响应的图像url,因此可以使用此url从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();
}

此解决方案仅适用于修复URL。如果图像url发生变化,那么它将无法工作。好吧,我猜这是值得一提的。感谢downvoteYes,提到它很好,但它不是这个问题的上下文,我们应该始终尝试将实际答案直接指向问题,而不是提及用户没有问过的其他问题。由于他提到他想将图片保存在存储器中,这也意味着他将进一步使用此图像,如更新裁剪、调整大小等。很抱歉,否决投票。:)一点问题也没有Prashant,很好,谢谢你花时间解释。我明白你的意思了,看来我没有领会他的问题的意思。谢谢你的回答。我不想修改这张图片,只是在用户脱机时显示它。我不知道这个缓存,我也尝试了你的解决方案。但当我离线时,图片不在这里。。。那么,这是一件正常的事情吗?你应该将答案标记为正确,以信任Prashant,并帮助其他用户在将来找到一个可行的解决方案。:)