【问题标题】:Send a recorded file via Filetransfer with Cordova/Phonegap使用 Cordova/Phonegap 通过 Filetransfer 发送录制的文件
【发布时间】:2014-08-06 09:56:58
【问题描述】:

我正在尝试发送通过媒体插件录制的录音。

当我尝试发送文件时,我收到此 FileError.NOT_FOUND_ERR 错误:

Error opening file /myRecording100.wav: Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0xa358640 {NSFilePath=/myRecording100.wav, NSUnderlyingError=0xa34fb30 "The operation couldn’t be completed. No such file or directory"}
2014-08-06 17:02:26.919 Bring Me[40961:c07] FileTransferError {
    code = 1;
    source = "/myRecording100.wav";
    target = "http://XXXX.xom";
}

但是,录音后我可以播放录音

为什么我可以播放文件(显示文件已录制并正确保存)但 FileTransfer 无法发送?

这是我的代码(适用于 ios):

var my_recorder = null;
var mediaFileFullName = null; // iOS
var mediaRecFile = "myRecording100.wav";
var checkFileOnly = false;

/******
 Call when start recording
******/
function startRecording() {
    checkFileOnly = false;
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccessFileSystem, function() {
        console.log("***test: failed in creating media file in requestFileSystem");
    });
}

function onSuccessFileSystem(fileSystem) {
    if (checkFileOnly === true) {        
        // Get File and send
        fileSystem.root.getFile(mediaRecFile, { create: false, exclusive: false }, onOK_GetFile, onFail_GetFile);
    }
    else {
        // Create File
        fileSystem.root.getFile(mediaRecFile, { create: true, exclusive: false }, onOK_SaveFile, onFail_GetFile);
      }
}

/* Save the file*/
function onOK_SaveFile(fileEntry) {
    mediaFileFullName = fileEntry.fullPath;
    my_recorder = new Media(mediaFileFullName, 
        function() { document.location ="address_form.html"; // Redirect the user to an other page  },
        function(err) { console.log("playAudio():callback Record Error: "+err);}
    );
    my_recorder.startRecord();
}

/* Get the file and send it */
function onOK_GetFile(fileEntry) {
    mediaFileFullName = fileEntry.fullPath;
    /*
        // Read the recorded file is WORKING !
        my_player = new Media(mediaFileFullName, onMediaCallSuccess, onMediaCallError);
        my_player.play();
    */
    var options = new FileUploadOptions();
    options.fileKey = "want";
    options.fileName = "file.wav";
    options.mimeType = "audio/wav";
    options.chunkedMode = false;
    options.params = parameters;

    var ft = new FileTransfer();
    ft.upload(mediaFileFullName, "https://SERVER_ADDRESS", win, fail, options);
}



/******
    Called when stop recording
******/
function stopRecording() {
    if (my_recorder) {
        my_recorder.stopRecord();
    }
}

【问题讨论】:

    标签: ios cordova file-upload media


    【解决方案1】:

    从文件插件v1.0开始,通过文件传输插件上传文件系统中的文件,需要使用.toURL()方法访问。

    如果您要升级到 File 的新版本(1.0.0 或更高版本),并且 您以前一直使用 entry.fullPath 作为参数 下载()或上传(),那么你需要改变你的代码来使用 文件系统 URL。

    FileEntry.toURL() 和 DirectoryEntry.toURL() 返回文件系统 URL 形式

    所以正确的代码是:

    /* Get the file and send it */
    function onOK_GetFile(fileEntry) {
    
        var options = new FileUploadOptions();
        options.fileKey = "want";
        options.fileName = "file.wav";
        options.mimeType = "audio/wav";
        options.chunkedMode = false;
        options.params = parameters;
    
        var ft = new FileTransfer();
        ft.upload(fileEntry.toURL(), "https://SERVER_ADDRESS", win, fail, options);
    }
    

    【讨论】:

      【解决方案2】:

      我在 iOS 上遇到了完全相同的问题,而 FileUploadOptions 对我不起作用。

      如果有人也在苦苦挣扎,我的解决方案是切换到 LocalFileSystem.Temporary。

      这里有一个 sn-p,它显示了一个完整的示例(在 Android 上测试):

      var accessType = LocalFileSystem.TEMPORARY; // It was LocalFileSystem.PERSISTENT;
      
      /** Utility function to return a fileEntry together with the metadata. */
      var getFile = function(name, create, successCallback, failCallback) {
      
          WL.Logger.debug("Request for file " + name + " received, create is " + create + ".");
      
          var onSuccessFileSystem = function(fileSystem) {
      
              fileSystem.root.getFile(name, { create: create, exclusive: false },
                  function(fileEntry){
      
                      WL.Logger.debug("Success, file entry for " + name + " is " + JSON.stringify(fileEntry));
      
                      fileEntry.getMetadata(function(metadata){
                          WL.Logger.debug("File entry " + name + " metadata is: " + JSON.stringify(metadata));
                          successCallback(fileEntry, metadata);
                      }, function(err) {
                          WL.Logger.debug("Fail to retrieve metadata, error: " + JSON.stringify(err));
                          if(failCallback) failCallback(err);
                      });
      
                  }, 
                  function(err) {
                          WL.Logger.error("Failed to retrieve the media file " + name + ".");
                          if(failCallback) failCallback(err);
                  });
      
          }
      
          window.requestFileSystem  = window.requestFileSystem || window.webkitRequestFileSystem;
      
          window.requestFileSystem(accessType, 0, onSuccessFileSystem, function(err) {
              WL.Logger.error("Failed to access file system.");
              if(failCallback) failCallback(err);
          });
      
      };
      
      
      var Recorder = declare([  ], {
      
          mediaSrc : null,
          mediaObj : null,
      
          constructor : function(data, domNode){
              this.mediaSrc = "new_recording.wav";
          },
      
          startRecord : function() {
      
              var self = this;
      
              var startRecording = function(source) {
      
                  var onMediaCallSuccess = function()  { WL.Logger.debug("Media object success."); };
                  var onMediaCallError = function(err) { WL.Logger.error("Error on the media object: " + JSON.stringify(err)); };
      
                  self.mediaObj = new Media(source, onMediaCallSuccess, onMediaCallError);
                  self.mediaObj.startRecord();
      
              };
      
              // On iOS, first I need to create the file and then I can record.
              if (deviceCheck.phone.ios) {
                  WL.Logger.debug("iOS detected, making sure the file exists.");
                  getFile(this.mediaSrc, true, function(fileEntry){ startRecording(fileEntry.fullPath); });
              } else {
                  if (!deviceCheck.phone.android)
                      WL.Logger.warn("Don't know the device, trying to record ...");
                  else
                      WL.Logger.debug("Android detected.");
                  startRecording(this.mediaSrc);
              }
      
          },
      
          stopRecord : function() {
              this.mediaObj.stopRecord();
              this.mediaObj.release();
          },
      
          play: function() {
      
              var p,
                  playSuccess = function() { WL.Logger.debug("Play success."); p.release(); },
                  playFail = function() { WL.Logger.debug("Play fail."); };
      
              p = new Media(this.mediaSrc, playSuccess, playFail);
              p.play();
      
          },
      
          getData : function(successCallback, failCallback) {
      
              var fileName = (deviceCheck.phone.android ? "/sdcard/" : "") + this.mediaSrc;
      
              WL.Logger.debug("Asking for the file entry ... ");
      
              getFile(this.mediaSrc, false,
                      function(fileEntry, metadata) {
      
                          WL.Logger.debug("Success: I found a file entry: " + fileEntry.nativeURL + ", size is " + metadata.size);
      
                          fileEntry.file(function(file) {
                              WL.Logger.debug("Success: file retrieved!");
                              var reader = new FileReader();
                              reader.onloadend = function(evt) {
                                  WL.Logger.debug("Sending content and event data to success callback.");
                                  successCallback(this.result, metadata, evt);
                              };
                              reader.readAsDataURL(file);
                          }, function(err){
                              WL.Logger.error("Error: Impossible to retrieve the file");
                              failCallback(err);
                          })
      
                      }, function(err){
                          WL.Logger.error("Fail: no file entry found: " + JSON.stringify(err));
                          failCallback(err);
                      });
      
          }
      
      });
      

      有一点 Worklight(调试输出)和 dojo(声明),但此代码可用作参考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 2018-01-25
        • 2016-06-05
        • 2016-01-09
        • 2017-04-18
        • 2015-08-29
        • 2019-05-10
        相关资源
        最近更新 更多