Phonegap Build:在您应用的其中一个文件夹中下载图片

时间:2014-06-19 06:34:39

标签: android angularjs cordova download phonegap-build

如果我直接用

指定路径,我可以下载图像
  

文件:///存储/ sdcard0 /

如何将图像保存到我应用中的某个文件夹中?我尝试this方法来设置应用路径,但它对我不起作用。

这是我到目前为止所使用的,如果你想保存并成像到SD卡,它可以工作:

var fileName = "myImage.png";  
var fileTransfer = new FileTransfer();

var uri = encodeURI("http://my.url.to.image/myImage.png");   

var filePath = "file:///storage/sdcard0/uploads/myImage.png";

fileTransfer.download(
    uri,
    filePath,
    function(entry) {
        alert("download complete: " + entry.fullPath);
        console.log("download complete: " + entry.fullPath);
    },
    function(error) {  
        alert("download error source/target/code:\n" + error.source +" \n||| "+error.target+" \n||| "+error.code);
     console.log("download error source/target/code " + error.source+" / "+error.target+" / "+error.code); 
    }  
); 

如果我使用此功能:

function getPhoneGapPath() {
    'use strict';
    var path = window.location.pathname;
    var phoneGapPath = path.substring(0, path.lastIndexOf('/') + 1);
    return phoneGapPath;
}

我得/ android_asset / www /。我如何获得正确的应用程序路径?

该应用程序正在使用AngularJS并且未在onDeviceReady中启动(开发人员在我之前就这样做了,现在将其更改为类似this的东西超出了我(尝试过但没有用))。

我可以提到的另一个问题是here 我还尝试了thisthisthisthis,但没有一个适合我。我得到了“”for fullPath,最近我设法用.toURL()打印路径,它是“cdvfile:// localhost / persistent”。 如果我使用

,以上下载代码现在也可以使用
filePath = "cdvfile://localhost/persistent/MyAppID/uploads/myImage.png";

但这会在/ storage / sdcard0中创建文件夹/ MyAppID / uploads,这又是坏事。我的应用程序需要使用

获取图像
<img src="uploads/myImage.png" alt="myimg"/>

另一个有用的链接是here,但它没有提供有关如何写入您自己应用的预先创建的文件夹的帮助。

编辑:据我所知,你不能在自己的应用程序中编写(只读)。这就是我尝试使用

引用sdcard图像的原因
<img src="file:///storage/sdcard0/Android/data/com.app.my/cache/myImage.png" alt="myimg"/>

这有效! :)不幸的是,这是硬编码而且不好,因为其他手机可能有不同的持久位置。 如果我试试

<img src="cdvfile://localhost/persistent/Android/data/com.app.my/cache/myImage.png" alt="myimg"/>

这不参考图片:/(它确实在存储/ sdcard0 / Android / data / com.app.my / cache /下载它)

2 个答案:

答案 0 :(得分:1)

据我所知,你无法写入自己的应用程序(更改应用程序内的项目 - Android上的/ www文件夹)。

我的解决方案是将图像保存到PERSISTENT存储(通常是SD卡)。 您可以通过以下步骤获取应用程序的永久存储路径:

function onDeviceReady() {
    console.log('Device Platform: ' + device.platform);  // returns 'Android' or 'iOS' for instance
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); 
    cacheFolderSubPath = "Android/data/com.id.myApp/cache/"; // this is app's cache folder that is removed when you delete your app! (I don't know what this path should be for iOS devices)  
}

然后在getFS成功回调

function gotFS(fileSystem) { 
    var nturl = fileSystem.root.toNativeURL(); // cdvfile://localhost/persistent/
    window.resolveLocalFileSystemURL(nturl+cacheFolderSubPath, onResolveSuccess, onResolveFail);
}

和onResolveSuccess

function onResolveSuccess(fileEntry){
    appCachePath = fileEntry.toNativeURL()+"/"; // file:///storage/sdcard0/Android/data/com.id.myApp/cache/ in my case but some other Androids have storage/emulated/0 or something like that ... 
    continueCustomExecution();
}

现在在continueCustomExecution()中你可以运行你的程序并做你做的任何事情......在这种情况下,将图像下载到我们之前获得的appCachePath中。您现在可以使用我们的appCachePath + yourImageName成功引用src标记中的图像。

不幸的是,我仍然不知道如何在 iOS 上成功下载图片。我用FileTransfer插件得到一个错误代码1 ...(保存到文件:///var/mobile/Applications/my.app.id/Documents/)。可能应该保存在其他地方,但这是我在请求PERSISTENT FileSystem时获得的路径。

干杯

答案 1 :(得分:0)

我会使用此处插件文档(https://github.com/apache/cordova-plugin-file/blob/master/doc/index.md)中定义的文件夹别名。特别是cordova.file.dataDirectory。请注意,这不是afaik,在原始项目的www下,但它似乎是存储下载的首选位置。保存到那里后,您可以将其解析为可用于通过AJAX加载的URL,或者在下载图形时使用img标记。