【问题标题】:Cordova/phonegap: FileTransferError.FILE_NOT_FOUND_ERR with file transfer pluginCordova/phonegap:带文件传输插件的 FileTransferError.FILE_NOT_FOUND_ERR
【发布时间】:2017-09-13 14:08:24
【问题描述】:

在我的 phonegap 应用程序中,我用相机拍照,它按预期工作。

然后,我想将它发送到我的服务器。我发现发送 base64 编码的字符串是一种不好的做法,我认为最好的解决方案是使用文件传输插件。

所以,我添加了插件并写了这个:

function onPhotoURISuccess(imageURI) {
    try{
        var url = "myserver/addPhoto";
        alert(url);
        var options = new FileUploadOptions();
        options.chunkedMode = false;
        options.fileKey = "recFile";
        var imagefilename = imageURI;
        options.fileName = imagefilename;
        options.mimeType = "image/jpeg";
        options.params = { "token": APP.TOKEN};
        var ft = new FileTransfer();
        alert(imagefilename);
        ft.upload(imageURI, url, win, fail, options); 
    }
    catch (err) {
        alert(err.message);
    }
}

在 try 分支的最后一行,我收到错误 FileTransferError.FILE_NOT_FOUND_ERR

在此行之前的警报中,我在警报中显示路径(imagefilename 变量)。如果我尝试在我的 Android 设备中手动进入该路径,我将找不到它。路径是file:///storage/emulated/0/Android/data/com.My.App/cache/1505307795417.jpg

所以,我尝试设置选项

saveToPhotoAlbum: true

检查图像是否已保存以及我是否正确地在我的相册中看到了照片。我不知道为什么我在发送时收到错误,可能是路径错误?

我不认为问题出在服务器端,因为我什至在服务器日志中都看不到请求。

更新

我也在Anuj T的建议下试过这个,但结果还是一样:

function onPhotoURISuccess(imageURI) {
    var filepath;
    window.resolveLocalFileSystemURL(imageURI, function success(fileEntry) {

        // Do something with the FileEntry object, like write to it, upload it, etc.
        // writeFile(fileEntry, imageURI);
        filepath = fileEntry.fullPath;
        alert("got file: " + fileEntry.fullPath);
        // displayFileData(fileEntry.nativeURL, "Native URL");

        try {
            var url = "myUrl";
            alert(url);
            var options = new FileUploadOptions();
            options.chunkedMode = false;
            options.fileKey = "recFile";
            var imagefilename = filepath;
            options.fileName = imagefilename;
            options.mimeType = "image/jpeg";
            options.params = { "token": APP.TOKEN }; // if we need to send parameters to the server request
            var ft = new FileTransfer();
            alert(imagefilename);
            alert(imageURI);

            ft.upload(filepath, url, win, fail, options);
        }
        catch (err) {
            alert(err.message);
        }

    }, function () {
        // If don't get the FileEntry (which may happen when testing
        // on some emulators), copy to a new FileEntry.
        alert("file system fail");
        createNewFileEntry(imgUri);

    });


}

更新 2:

这是我的服务器端代码。

internal GenericResponse AddChiusuraPhoto(string token)
    {
        Utility.Logger("AddChiusuraPhoto");
        var gr = new GenericResponse();
        if (CheckToken(token, out IS_UTENZE utente))
        {
            try
            {
                var md5 = new md5Manager();
                HttpPostedFile file = HttpContext.Current.Request.Files["recFile"];
                if (file == null)
                    return null;
                string targetFilePath = @"C:\ProgramData\" + file.FileName;
                file.SaveAs(targetFilePath);
                Utility.Logger("[AddChiusuraPhoto] Returning lista ");
                return gr;
            }
            catch (Exception ex)
            {
                gr.ESITO = "[KO]";
                gr.MESSAGGIO = ex.ToSafeString();
                Utility.Logger("AddChiusuraPhoto " + gr.MESSAGGIO);
            }
        }
        else
        {
            gr.ESITO = "[KO]";
            gr.MESSAGGIO = "Utente non loggato, impossibile effettuare il logout.";
            Utility.Logger("AddChiusuraPhoto " + gr.MESSAGGIO);
        }
        return gr;
    }

请注意,这是一个 WCF。这是寻址部分:

[OperationContract]
[WebInvoke(UriTemplate = "chiusure/addPhoto", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
GenericResponse AddChiusuraPhoto(string token);

【问题讨论】:

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


    【解决方案1】:

    需要拍照并获取一个FileEntry对象

    如果您需要使用 FileEntry 对象,请在您的 CameraOptions 对象中将 destinationType 设置为 Camera.DestinationType.FILE_URI

    更新代码

    function getPicture(){
    
          var srcType = Camera.PictureSourceType.CAMERA;
          var options = setOptions(srcType);
          //var func = createNewFileEntry;
    
          navigator.camera.getPicture(function cameraSuccess(imageUri) {
    
              //displayImage(imageUri);
              // You may choose to copy the picture, save it somewhere, or upload.
              //func(imageUri);
              var filename = imageUri.substr(imageUri.lastIndexOf('/') + 1);
              window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function success(dirEntry) {
    
                  // Do something with the FileEntry object, like write to it, upload it, etc.
                  // writeFile(fileEntry, imgUri);
                  console.log("got file: " + dirEntry.fullPath);
    
                  console.log("file name " + filename);
                  // JPEG file
                  dirEntry.getFile(filename, { create: true, exclusive: false }, function (fileEntry) {
    
                          // Do something with it, like write to it, upload it, etc.
                          // writeFile(fileEntry, imgUri);
                          console.log("got file: " + fileEntry.fullPath);
                          // displayFileData(fileEntry.fullPath, "File copied to");
                          upload(fileEntry);
    
                      }, onErrorCreateFile);                      
                  // displayFileData(fileEntry.nativeURL, "Native URL");
              }, function () {
                // If don't get the FileEntry (which may happen when testing
                // on some emulators), copy to a new FileEntry.
                  //createNewFileEntry(imgUri);
              });
              //console.log(imageUri);
    
          }, function cameraError(error) {
              console.debug("Unable to obtain picture: " + error, "app");
    
          }, options);
     };
    

    设置选项功能。

    function setOptions(srcType) {
      var options = {
          // Some common settings are 20, 50, and 100
          quality: 50,
          destinationType: Camera.DestinationType.NATIVE_URI ,
          // In this app, dynamically set the picture source, Camera or photo gallery
          sourceType: srcType,
          encodingType: Camera.EncodingType.JPEG,
          mediaType: Camera.MediaType.PICTURE,
          allowEdit: false,
          saveToPhotoAlbum:false,
          correctOrientation: true  //Corrects Android orientation quirks
      };
      return options;
    }
    

    详细解释见here

    上传文件到服务器

    function upload(fileEntry) {
    
     var fileURL = fileEntry.toURL();
    
     var success = function (r) {
         console.log("Successful upload..." + JSON.stringify(r));
         console.log("Code = " + JSON.stringify(r.responseCode));
         alert(JSON.stringify(r.response));
         // displayFileData(fileEntry.fullPath + " (content uploaded to server)");
     };
    
     var fail = function (error) {
         alert("An error has occurred: Code = " + error.code);
         console.log("Error= " + error);
     };
    
     var options = new FileUploadOptions();
      options.fileKey = "file";
      options.fileName = fileURL.substr(fileURL.lastIndexOf('/') + 1);
      options.mimeType = "text/plain";
    
    var params = {};
     params.value1 = "test";
     params.value2 = "param";
    
     options.params = params;
    
     var SERVER = "http://posttestserver.com/post.php";
    
     var ft = new FileTransfer();
     // SERVER must be a URL that can handle the request, like
     // http://some.server.com/upload.php
     ft.upload(fileURL, encodeURI(SERVER), success, fail, options);
    }
    

    当您收到成功警报时,您还可以检查您的参数是否上传到服务器,您将成功收到链接。

    希望对您有所帮助。

    【讨论】:

    • 你可以试试静态文件url路径吗??因为我无法重新创建我身边的问题..只需尝试“var fileURL =”///storage/emulated/0/DCIM/yourpic.jpg”看看是否有效...确保 yourpic.jpg 存在于您的文件系统。
    • 代码中的文件路径 "var filepath = "///storage/emulated/0/DCIM/yourpic.jpg"。
    • 更新了我的答案,检查编辑 2,我的演示工作正常。只需在按钮单击并检查时调用 uploadFile() 函数。
    • 只需检查与我的示例中相同的服务器 uri。如果上传成功,它将为您提供成功代码.. 200 和响应。那个uri有效。按原样尝试该功能..按原样调用它..没有变化..
    • ya任何网络服务都可以工作..只要确保你从ws发送响应..检查req是否命中你的网络服务..只需发送响应..
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多