[英]Cordova File-Transfer Not Hitting Server Endpoint
我正在尝试使用FT(cordova文件传输)创建文件以将文件发送到我的Express应用程序。 问题是,快递没有收到请求。 在某种程度上它起作用了,但是它停止了工作,我试图找出原因。
我的代码如下所示。
首先,我用cordova lib拍照,可以正常工作。
$scope.takePicture = function(){
Camera.getPicture().then(function(imageURI) {
$scope.lastPhoto = imageURI;
upload(imageURI)
}, function(err) {
console.err(err);
}, {
quality: 25,
targetWidth: 320,
targetHeight: 320,
saveToPhotoAlbum: false
});
};
但是,上载功能不会向快速服务器发送请求。
upload = function (imageURI) {
var ft = new FileTransfer();
var options = new FileUploadOptions();
options.fileKey = "photo";
options.fileName = 'filename'; // We will use the name auto-generated by Node at the server side.
options.mimeType = "image/jpeg";
options.chunkedMode = false;
options.httpMethod = 'put';
options.params = { // Whatever you populate options.params with, will be available in req.body at the server-side.
"description": "Uploaded from my phone"
};
ft.upload(imageURI, encodeURI(RESOURCES.PRODUCTION_DOMAIN + '/api/boats/' + $scope.boat._id),
function (e) {
console.log('File Transfer Completed', e)
},
function (e) {
alert("Upload failed", e);
}, options);
}
我没有看到请求进入我的服务器,并且看到失败的console.log。
为什么是这样?
我的服务器具有以下访问控制方法
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST', 'PUT', 'DELETE');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header('Access-Control-Allow-Credentials', true);
next();
我有
<access origin="*"/>
在我的应用程序的config.xml中。
为什么请求没有通过!?
编辑
使应用程序以X代码运行(下载新版本...)后,我看到错误如下。
2015-10-26 05:00:54.955 Fish App[358:68325] File Transfer Finished with response code 404
2015-10-26 05:00:54.956 Fish App[358:68325] FileTransferError {
body = "";
code = 3;
"http_status" = 404;
source = "file:///var/mobile/Containers/Data/Application/598EAE4A-F0E4-4A3B-A4A4-0DB657981122/tmp/cdv_photo_010.jpg";
target = "http://example.com/api/boats/";
}
同样重要的是要注意,我必须配置nginx设置以允许大于1M的文件大小,只有THEN才出现上述错误。 为什么是404? 目标是正确的。
我的清单中有以下内容允许所有连接...
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
编辑2:
我在index.html
添加了CSP策略,这似乎是最不安全的方法,我认为这将使我能够顺利通过上传!
<!-- This policy allows everything (eg CSS, AJAX, object, frame, media, etc) except that
* CSS only from the same origin and inline styles,
* scripts only from the same origin and inline styles, and eval()
-->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; img-src '*' script-src 'self' 'unsafe-inline' 'unsafe-eval'">
更新2016-04-11: Google很快将要求使用Cordova / Phonegap的新应用和更新的应用程序至少为4.1.1 详细信息: Android 4.1.1之前的版本将被阻止
您需要添加白名单,插件和CSP 。 或将版本设置为编译器。
白名单的替代方法是此快速解决方案-但请注意,此快速修复可以消除white-list
所有需求。 这会创建一个安全问题 ,您可能不希望通过。
快速修复将此仅添加到PHONEGAP BUILD的 config.xml
中
<preference name="phonegap-version" value="3.7.0" />
此方法将于2016年5月之后不可用。
长答案是这样的:
从Cordova / Phonegap的开发人员的最新失误中您可以找到:
对于#6和#7
使用CLI版本时,如果您未为平台分配版本,或者如果未在config.xml中设置phonegap-version,则在“ Phonegap Build”中分配了最新版本。 如果幸运的话,您的程序将按预期运行。 如果您不走运,则会出现一系列级联错误。
幸运的是,我们所有人Holly Schinsky都写了一篇不错的博客文章来解释这一切:
Cordova / PhoneGap版本混乱
http://devgirl.org/2014/11/07/cordovaphonegap-version-confusion/
对于#10
这种相对*新*的要求意味着–要访问任何网站或Web资源,您必须使用白名单和白名单插件。 如果您使用的是cordova-android@4.0.0或更高版本,则此要求生效。 包括cli-5.1.1和cli-5.2.0。 但是,如果您的版本低于4.0.0(例如3.5.0或3.7.0),那么您将不必添加白名单要求。
需要明确的是,“白名单”已经存在了一段时间,但是插件和要求是非常新的。 如您所料,添加“白名单”后,事实上的开放式访问功能已被弃用。 或者说另一种方式,事实上的开放式访问功能已被计划并计划取消。 此更改标志着取消了开放式访问功能的一步。
此外,内容安全政策(CSP)吸引了众多开发人员-因为它的宣传不力。 根据您的使用和使用的Phonegap的版本,CSP需要进入您使用的每个HTML页面,就像您必须等待“ deviceready”一样。 但是,在某些情况下根本不需要它。 该文档有些令人困惑,请仔细阅读。 该文档埋在许多最新文档页面的底部。
最后,雷蒙德·卡姆登(Raymond Camden)在他的博客中指出, 从科尔多瓦5开始,政策发生了巨大变化
相关链接
Phonegap Build论坛: 在PGB上升级到cli-5.1.1的注意事项 ,现在需要白名单
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.