Cordova文件传输未命中服务器端点

时间:2015-10-26 03:16:55

标签: javascript cordova ionic

我尝试使用FT(cordova文件传输)创建文件,将文件发送到我的快递应用程序。 问题是,快递没有得到请求。有一点它有效,但它停止了工作,我试图找出原因。

我的代码看起来像这样。

首先我用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-code运行(下载新版本......) 我看到错误如下。

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的文件大小,只有这样我才得到上述错误。为什么是404?目标是正确的。

我的plist中有以下内容允许所有连接...

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

EDIT2:

我在我的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'">

1 个答案:

答案 0 :(得分:1)

  

更新2016-04-11: Google很快会要求使用Cordova / Phonegap的新的和更新的应用至少为4.1.1 详细信息: Android pre-4.1.1 to be blocked

您需要添加白名单,插件和CSP OR 将版本设置为编译器。

修复了许多常见的白名单问题

white-list 的替代方法是快速修复 - 但要知道此快速修复会消除white-list的所有需求。这会创建一个您可能不希望通过的security issue

快速修复将此添加到config.xml PHONEGAP BUILD ONLY
<preference name="phonegap-version" value="3.7.0" />

此方法将于2016年5月之后无法使用。

长期答案

来自Top Mistakes by Developers new to Cordova/Phonegap你已经点击了:

  • #6 未为编译器设置“phonegap版本”
  • #7 没有为您的插件设置“版本”
  • #10 未在config.xml中添加新的“white-list”和“white-list plugin”参数。

对于#6&amp; #7

  

使用CLI版本,如果您没有为您的平台分配版本,或者如果您未在config.xml中设置phonegap-version,则在“Phonegap Build”中,您将获得最新版本。如果运气好,您的程序就会按预期运行。如果你不幸运,你会得到一系列级联错误。

     

幸运的是,对于我们所有人来说,Holly Schinsky写了一篇很好的博文来解释这一切:

     

Cordova / PhoneGap版本混淆
  http://devgirl.org/2014/11/07/cordovaphonegap-version-confusion/

#10

  

这个相对*新*要求意味着 - 要访问网络上的任何网站或资源,您必须使用白名单和白名单插件。如果您使用cordova-android@4.0.0或更高版本,此要求将生效;包括cli-5.1.1和cli-5.2.0。但是,如果您的版本在4.0.0之前,假设为3.5.0或3.7.0,则必须添加 white-list 要求。

     

要明确的是,“白名单”已经存在了一段时间,但插件和要求非常新。正如您所料,当添加“白名单”时,不推荐使用事实上的开放访问功能。或者说另一种方式,事实上开放访问功能已被计划并计划被淘汰。此更改标志着删除开放访问功能的一个步骤。

     

此外,内容安全策略(CSP)已经吸引了众多开发人员 - 因为它的公开性很差。 根据您的使用情况和您使用的Phonegap版本,CSP需要进入您使用的每个HTML页面,就像您必须等待'deviceready'一样。但是,有些情况根本不需要它。文档让一些人感到困惑,请仔细阅读。文档隐藏在许多最新文档页面的底部。

     

最后,Raymond Camden在他的博客中指出LARGE change in policy starting with Cordova 5

相关链接

  

Phonegap Build Forum:Notes for upgrading to cli-5.1.1 on PGB,现在需要白名单