【问题标题】:Phonegap fileTransfer.Download is not working error code 3Phonegap fileTransfer.Download 不工作错误代码 3
【发布时间】:2015-01-19 09:50:44
【问题描述】:

在我在 android 4.4 上运行 phonegap cordova 3.5 的应用程序中,使用文件传输插件上传文件效果很好,但下载会产生异常。我在设备和模拟器 blueStacks 上进行了测试 此代码适用于cordova 2.9,但是当我将cordova 更新到3.5 时,下载创建异常

下载功能:

download = function () {    
    viewModel.popup_download.visible(false);
    loadPanelVisible(true);
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
      fileSystem.root.getFile(viewModel.file_download_name(), {create: true, exclusive: false}, function() {
        var ft = new FileTransfer(); 
        uri="https://api.exemple-exemple.com/api/Dav/Download/"+path+"/"+viewModel.folder_downlod();
        filePath=currPath+"/"+viewModel.file_download_name();

        ft.download(uri,filePath,win_download,fail_download,false, {
                headers: { 
                   "HeaderUserData": JSON.stringify({ ID: id, Token: token }),
                   "HeaderDavData": JSON.stringify({ UserName: viewModel.userId_dav(), Password: viewModel.userPassword_dav() }),
                }
        });

      }, fail);
    }, fail); 
}

【问题讨论】:

  • l'exception :{"target":"file:\/\/\/mnt\/sdcard\/windows\/PublicPictures\/Box-BV-Blanche.jpg", "source" :"https:\/\/api.phosphorus-technologies.com\/api\/Dav\/Download\/dossier1\/Box-BV-Blanche.jpg", "http_status":200, "code":3} java.lang.NullPointerException at org.apache.cordova.PluginResult.(PluginResult.java:52) at org.apache.cordova.filetransfer.FileTransfer$4.run(FileTransfer.java:798) at java.util.concurrent .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

标签: android cordova download file-transfer cordova-plugins


【解决方案1】:

您在空格和特殊字符方面遇到问题,您必须在发送请求之前使用 encodeURI。

download = function () {    
viewModel.popup_download.visible(false);
loadPanelVisible(true);
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
  fileSystem.root.getFile(viewModel.file_download_name(), {create: true, exclusive: false}, function() {
    var ft = new FileTransfer(); 
    uri="https://api.phosphorus-technologies.com/api/Dav/Download/"+path+"/"+viewModel.folder_downlod();
    filePath=currPath+"/"+viewModel.file_download_name();

    uri = encodeURI(uri);

    ft.download(uri,filePath,win_download,fail_download,false, {
            headers: { 
               "HeaderUserData": JSON.stringify({ ID: id, Token: token }),
               "HeaderDavData": JSON.stringify({ UserName: viewModel.userId_dav(), Password: viewModel.userPassword_dav() }),
            }
    });

  }, fail);
}, fail);} 

【讨论】:

    【解决方案2】:

    从未定义变量 currPath,我认为您根本不想使用它。您从 viewModel 传递了您的下载文件夹,然后在回调中获取文件夹结果。

    download = function () {    
        viewModel.popup_download.visible(false);
        loadPanelVisible(true);
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
          fileSystem.root.getFile(viewModel.folder_downlod(), {create: true, exclusive: false}, function(filePath) { // ADD PARAMETER HERE
            var ft = new FileTransfer(); 
            uri="https://api.phosphorus-technologies.com/api/Dav/Download/"+path+"/"+viewModel.folder_downlod(); //IS THIS A VALID URL ENDING IN THE FOLDER NAME?
    //REMOVE FILE PATH HERE
            ft.download(uri,filePath,win_download,fail_download,false, {
                    headers: { 
                       "HeaderUserData": JSON.stringify({ ID: id, Token: token }),
                       "HeaderDavData": JSON.stringify({ UserName: viewModel.userId_dav(), Password: viewModel.userPassword_dav() }),
                    }
            });
    
          }, fail);
        }, fail); 
    }
    

    您构建以文件夹结尾的 API 调用让我担心,因为此代码仅适用于下载单个文件。我认为可能只是命名不一致。

    【讨论】:

    • filePath=currPath+"/"+viewModel.folder_downlod(); currPath 是设备中文件的路径 viewModel.folder_downlod() 是设备目标中文件的名称":"file:///mnt/sdcard/windows/PublicPictures/Box-BV-Blanche.jpg "‌​我选择制作下载文件的地方
    • 好吧,这更有意义。为清楚起见,您应该将方法 folder_download 重命名为 file_download 或(甚至更好)download_filename
    • 好的,我编辑它。此代码适用于cordova 2.9,但是当我将cordova 更新到3.5 时,下载创建异常
    • 当您调用fileSystem.root.getFile() 时,它会在回调中为您提供设备上文件的路径。添加文件路径作为参数并删除此行filePath=currPath+"/"+viewModel.file_download_name();
    • fileSystem.root.getFile() 仅给出根目录的路径,但 currPath 在调用下载函数之前给出当前文件夹路径 我选择下载文件的路径 currPath =data.fullPath;
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多