首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cordova文件管理

Cordova文件管理
EN

Code Review用户
提问于 2014-09-24 13:08:53
回答 1查看 1.4K关注 0票数 10

我正在使用Phonegap制作一个应用程序,用户可以在其中选择和共享文件。当用户选择它时,即使它离线或关闭应用程序,我也应该将它上传回服务器,所以我需要存储参考文件路径。

我所用的步骤:

  1. 用户使用相机选择/捕捉视频或图像。
  2. 当从库中选择时,文件不可能每次在Android中包含扩展名,在iOS中包含扩展名。
  3. 获取mimeType,然后用新的名称和扩展名将文件复制到myApp的文件夹中。
  4. 然后再次获取mimeType并返回。

每当用户选择媒体文件时,将文件复制到另一个位置是正确的吗?

代码语言:javascript
复制
 var obj = {
    destinationType: navigator.camera.DestinationType[fromCamera ? 'FILE_URI' : 'NATIVE_URI'],
    // If I use NATIVE_URI for when taking from Camera it returns null.
    sourceType: navigator.camera.PictureSourceType[fromCamera ? 'CAMERA' : 'PHOTOLIBRARY'],
    mediaType: navigator.camera.MediaType[image ? 'PICTURE' : 'VIDEO']
}, that = this;

if (image && fromCamera) {
    obj.correctOrientation = true;
    obj.quality = 40;
}

return new Promise(function (resolve, reject) {
    navigator.camera.getPicture(function (url) {
        var fail = function () {
            resolve(false);
        }
        window.setTimeout(function () {
            // mimeType uses window.resolveLocalFileSystemURL to get fileEntry
            that.mimeType(url).then(function (mimeObj) {
                /* 
                    mimeObj contains object like below  
                    {lastModified:'', fileType:'', fileExtension:'', name : ''}
                */
                if (mimeObj) {
                    // that.fileSystem() resolves fileSystem
                    that.fileSystem().then(function (fs) {
                        // dirName is where I want to store all myApp's media files.
                        var dirName = 'myApp/media/' + (image ? "images" : "videos") + '/';
                        that.getFile(url).then(function (fileEntry) {
                            // getFile uses window.resolveLocalFileSystemURL and returns fileEntry
                            that.moveTo(fs, fileEntry, dirName, mimeObj.name).then(function (entry) {
                                // MoveTo fill copy the same file to directory where I am manintaing files.
                                mimeObj.localURL = entry.nativeURL;
                                /* 
                                    mimeObj is failing to find extension 
                                    when user selects it from different albums. But not when user uses Camera. 
                                    So I am making again mimeType call.
                                */
                                that.mimeType(mimeObj.localURL).then(function (mimeObj) {
                                    // This gives me exact mimeObj that I need.
                                    resolve(mimeObj);
                                });
                            }, fail);
                        }, fail);
                    }, fail);
                } else {
                    resolve(false);
                }
            });
        }, 0);

    }, function (fail_message) {
        window.setTimeout(function () {
            reject(fail_message);
        }, 0);
    }, obj);
});
EN

回答 1

Code Review用户

发布于 2014-09-26 20:11:52

有趣的问题,

当然,用图片的副本来填满记忆是不好的。尤其是最近的这个丑闻,被删除的图片一直困扰着用户。

从阅读代码中可以看出,无论您是否具有扩展名和MIME类型,都需要获取文件的副本。至少只有在你没有别的办法的情况下才能复制。

此外,从文档(我可能是错的)中,FileEntry对象有一个名为file的方法,它创建一个File对象,该对象具有一个type属性,该属性是文件的mime类型。这能解决你的难题吗?如果这样做不起作用,您应该看看是否可以提交一个bug。

从真正的代码审查的角度来看,这是我的第一次快速介绍:

  • 尊重处理这个不成熟的API
  • 除了一个丢失的分号外,JsHint在这方面什么也没有。
  • 你考虑过使用'use strict'吗?
  • 多行注释肯定会停止阅读流程,但是删除它们会减少注释的价值。我想知道那些多行者是否能在你的功能之上成为一种叙述。
  • 您必须将事物分解为助手函数的限制,如以下箭头所示:});},fail);},false);},false);} of { resolve(false);});},};},函数(fail_message) {
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档