Cordova FileUpload API returns 错误代码 3

Cordova FileUpload API returns error code 3

我在尝试将图像文件上传到我的本地 Web 服务器(使用 wampserver 托管)时遇到问题 android 使用 IBM Worklight 6.2.0 和 Cordova 版本 3.4.0 构建的混合应用程序。代码片段如下:

<script type="text/javascript" charset="utf-8">
  // Wait for Cordova to load
  document.addEventListener("deviceready", onDeviceReady, false);

  // Cordova is ready
  function onDeviceReady() {
    // Nothing here
  }

  function getImage() {
    // Retrieve image file location from specified source
    navigator.camera.getPicture(uploadPhoto, function(message) {
      alert('get picture failed');
    }, {
      quality: 40,
      destinationType: Camera.DestinationType.FILE_URI,
      sourceType: Camera.PictureSourceType.PHOTOLIBRARY
    });

  }

  function uploadPhoto(imageURI) {
    var options = new FileUploadOptions();
    options.fileKey = "file";
    options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1);
    options.mimeType = "image/jpeg";

    var params = new Object();
    params.value1 = "test";
    params.value2 = "param";

    options.params = params;
    options.chunkedMode = false;

    var ft = new FileTransfer();
    ft.upload(imageURI, encodeURI("http://192.168.1.4:8081/folder_name/upload2.php"), win, fail, options);
  }

  function win(r) {
    console.log("Code = " + r.responseCode);
    console.log("Response = " + r.response);
    console.log("Sent = " + r.bytesSent);
    alert(r.response);
  }

  function fail(error) {
    alert("An error has occurred: Code = " + error.code);
  }
</script>

<button onclick="getImage();">Upload a Photo</button>

upload2.php

<?php print_r($_FILES); $new_image_name="namethisimage.jpg" ; move_uploaded_file($_FILES[ "file"][ "tmp_name"], "folder_name/uploads/".$new_image_name); ?>

我收到 http 状态 200 和错误代码 3。除此之外,我还在 http 状态和错误代码错误下方收到此错误。

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:14584 from pid=4926, uid=10092 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

有什么解决办法吗?或者有什么更好的上传图片文件的方法吗?

我已将以下内容添加到 AndroidManifest.xml

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

根据最后一张图片,您似乎以某种方式解决了这个问题 - 您应该分享它作为答案。

无论如何,

  1. 为什么您的代码段中有 PHP 代码?此代码片段是否源自您基于 Worklight 的应用程序?你不能在那里 PHP...这是一个移动应用程序,运行 在你的设备上,而不是在你的服务器上。那里没有任何东西可以解释该代码。

  2. 不应在您的应用程序中使用以下内容,因为 Cordova 是 Worklight 框架的一部分并且此检查是在内部完成的。相反,您的代码应该位于 main.js 中的 wlCommonInit() 函数内,或者从那里调用。

    // Wait for Cordova to load
    document.addEventListener("deviceready", onDeviceReady, false);
    
    // Cordova is ready
    function onDeviceReady() {
        // Nothing here
    }
    

我怀疑这就是为什么对您不起作用的原因。尝试使用 AJAX 向服务器发出请求,接收发送的图像并将其存储在您的网络服务器中。

我不确定这里有什么问题。即使使用 AngularJS,我的代码也会突然工作。如果其他人可能想参考,我将在这里分享我的工作代码。

main.js

$scope.getImage = function() {
             // Retrieve image file location from specified source
             navigator.camera.getPicture(onSuccess, function(message) {
                alert('get picture failed');
            },{
                quality: 50, 
                destinationType: Camera.DestinationType.FILE_URI,
                sourceType: Camera.PictureSourceType.PHOTOLIBRARY
            }
             );
         }

        function onSuccess(imageURI) {
            $scope.image = imageURI;
        };

         function uploadPhoto(image) {

             var options = new FileUploadOptions();
             options.fileKey="file";
             options.fileName= $scope.imageName;
             options.mimeType="image/jpeg";

             var params = new Object();
             params.value1 = "test";
             params.value2 = "param";

             options.params = params;
             options.chunkedMode = false;

             var ft = new FileTransfer();
             ft.upload(image, encodeURI(ipaddress_to_your_server/root_folder/upload.php), win, fail, options);
         }

         function win(r) {
             console.log("Code = " + r.responseCode);
             console.log("Response = " + r.response);
             console.log("Sent = " + r.bytesSent);
             alert(r.response);
         }

         function fail(error) {
             alert("An error has occurred: Code = " + error.code);
         }

upload.php

<?php
print_r($_FILES);
$image_name = $_FILES['file']['name'];
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/".$image_name);
?>

您只需调用 html 中的 $scope.getImage 函数即可打开设备的照片库。