8

我自己回答了这个问题,因为我花了很长时间才找到解决方案,而且没有很好的记录。

4

2 回答 2

22

在尝试使用FileTransfer()将图像从 android 上的phonegap应用程序上传到远程服务器时,我在每个备用文件上传时都 收到错误代码 3 。

它工作了一次,但当我再次尝试时它会立即抛出错误,甚至不会将文件发送到服务器。

我用于文件上传的代码是:

使其工作的关键是添加一个标题选项。

options.headers = {
        Connection: "close"
    }
    options.chunkedMode = false;


完整代码:

var options = new FileUploadOptions();

                        options.fileKey="file";
                        options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
                        options.mimeType="image/jpeg";
                        options.chunkedMode = false;
                        *options.headers = {
                           Connection: "close"
                        };*

                        // setup parameters
                        var params = {};
                        params.fullpath =imageURI;
                        params.name = options.fileName;



                        var ft = new FileTransfer();

                        ft.upload(imageURI, encodeURI(url+'/account/profile-pics'), win, fail, options);


 function win(r) {
                  //file uploaded successfully
                }
            function fail(error) {


                alert("An error has occurred: Code = " + error.code);
                alert("upload error source " + error.source);
                alert("upload error target " + error.target);
            }
于 2013-10-09T14:44:44.680 回答
0

错误代码 3 是一个相当广泛的错误;这基本上意味着您的服务器编码不正确或您没有互联网连接,这会导致连接错误。

可能意味着:

  1. 您没有在服务器上安装多部分插件。在 PHP 中设置“file_uploads = On”(在 PHP.ini 中),在 ExpressJS 中您需要 Multer 中间件插件(https://www.npmjs.com/package/multer)等。
  2. 文件上传大于您的服务器允许的大小 - 这导致状态代码 413 错误,并显示“请求实体太大”的消息。要在 PHP 上解决此问题,您需要调整upload_max_filesizephp.ini 中的设置,要在 ExpressJS 上解决此问题,您需要调整limitMulter 的字段等。基本上,增加服务器上的文件上传大小。大多数服务器限制文件上传大小作为安全措施。(https://www.owasp.org/index.php/Unrestricted_File_Upload
  3. options.fileKey值 (ie <input type="file" name="fileKey" />) 不是您的服务器期望的名称 - 示例错误消息可能是“意外字段”。
  4. 标头中的content-type字段没有值multipart/form-data; boundary=----WebKitFormBoundary。在服务器上记录请求标头,可用于检查内容类型是否设置正确。

使用文件传输上传照片

@AugieGardner - 同样同意 Cordova 文件传输插件没有很好地记录上传使用相机插件拍摄的照片。

幸运的是,我有一个适用于 iOS 的示例(我猜也是 Android):
cordova 文件传输插件在 ios 模拟器中不起作用

无需文件传输的照片上传

一个更简单的替代方案(或后备方案)是将图像编码为 Base64,并通过普通的旧 AJAX POST 请求发送。其中包括以下优点和缺点。

通过 AJAX 发送 Base64 编码图像的缺点

  1. 您可能需要增加服务器上的请求限制大小,以免出现 413 错误(即“请求实体太大”)。
  2. Base64 图像比二进制图像大 37%,这很可能导致上传速度变慢。
  3. 可能不适合视频或其他文件类型。

通过 AJAX 发送 Base64 编码图像的优势

  1. 更小的应用程序大小(和更快的应用程序下载),因为 Cordova 的文件传输插件,可能还有 Cordova 的文件插件不会增加应用程序的开销。
  2. 当您将应用程序扩展到新的操作系统(即 iOS、Android 等)时,您不必修复文件传输插件错误。
  3. 您可能不需要服务器上的多部分服务(或中间件)来上传图像。
于 2016-06-19T07:52:43.253 回答