我自己回答了这个问题,因为我花了很长时间才找到解决方案,而且没有很好的记录。
问问题
13413 次
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 是一个相当广泛的错误;这基本上意味着您的服务器编码不正确或您没有互联网连接,这会导致连接错误。
可能意味着:
- 您没有在服务器上安装多部分插件。在 PHP 中设置“file_uploads = On”(在 PHP.ini 中),在 ExpressJS 中您需要 Multer 中间件插件(https://www.npmjs.com/package/multer)等。
- 文件上传大于您的服务器允许的大小 - 这导致状态代码 413 错误,并显示“请求实体太大”的消息。要在 PHP 上解决此问题,您需要调整
upload_max_filesize
php.ini 中的设置,要在 ExpressJS 上解决此问题,您需要调整limit
Multer 的字段等。基本上,增加服务器上的文件上传大小。大多数服务器限制文件上传大小作为安全措施。(https://www.owasp.org/index.php/Unrestricted_File_Upload) - 该
options.fileKey
值 (ie<input type="file" name="fileKey" />
) 不是您的服务器期望的名称 - 示例错误消息可能是“意外字段”。 - 标头中的
content-type
字段没有值multipart/form-data; boundary=----WebKitFormBoundary
。在服务器上记录请求标头,可用于检查内容类型是否设置正确。
使用文件传输上传照片
@AugieGardner - 同样同意 Cordova 文件传输插件没有很好地记录上传使用相机插件拍摄的照片。
幸运的是,我有一个适用于 iOS 的示例(我猜也是 Android):
cordova 文件传输插件在 ios 模拟器中不起作用
无需文件传输的照片上传
一个更简单的替代方案(或后备方案)是将图像编码为 Base64,并通过普通的旧 AJAX POST 请求发送。其中包括以下优点和缺点。
通过 AJAX 发送 Base64 编码图像的缺点
- 您可能需要增加服务器上的请求限制大小,以免出现 413 错误(即“请求实体太大”)。
- Base64 图像比二进制图像大 37%,这很可能导致上传速度变慢。
- 可能不适合视频或其他文件类型。
通过 AJAX 发送 Base64 编码图像的优势
- 更小的应用程序大小(和更快的应用程序下载),因为 Cordova 的文件传输插件,可能还有 Cordova 的文件插件不会增加应用程序的开销。
- 当您将应用程序扩展到新的操作系统(即 iOS、Android 等)时,您不必修复文件传输插件错误。
- 您可能不需要服务器上的多部分服务(或中间件)来上传图像。
于 2016-06-19T07:52:43.253 回答