2015-01-26 4 views
0

У меня возникла проблема с загрузкой файла изображения на мой локальный веб-сервер (размещенный с использованием wampserver) для Android-приложения, созданного с использованием IBM Worklight 6.2.0 с версией Cordova 3.4.0. Фрагмент кода, как показано ниже:Кордова FileUpload API возвращает код ошибки 3

<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); ?> 

Я получаю статус 200 HTTP и код ошибки 3. Кроме того, я также получаю эту ошибку ниже статуса HTTP и ошибка кода ошибки.

java.lang.SecurityException: Разрешение Отрицание: чтение com.android.providers.media.MediaDocumentsProvider содержание URI: //com.android.providers.media.documents/document/image: 14584 с PID = 4926, uid = 10092 требует android.permission.MANAGE_DOCUMENTS или grantUriPermission()

Есть ли какие-либо решения? Или есть лучший способ загрузить файл изображения?

Я добавил следующее AndroidManifest.xml

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

1) вызов deviceready не требуется; Worklight делает это для вас внутренне, иначе приложение не будет работать вообще. –

+0

2) Убедитесь, что вы добавили android: permission = "android.permission.MANAGE_DOCUMENTS" –

+0

@IdanAdar Забыл отметить, что я уже добавил разрешение MANAGE_DOCUMENTS в AndroidManifest.xml.Я удалил вызов deviceready, он все еще возвращает код ошибки 3. – imationyj

ответ

1

Я не уверен, в чем проблема. Мой код просто работает внезапно, даже с 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); 
?> 

Вам просто нужно вызвать $scope.getImage функцию в HTML, чтобы открыть библиотеку фотографий устройства.

0

На основании последнего изображения, кажется, что вы решили эту проблему каким-то образом - вы должны разделить его в качестве ответа.

Несмотря на это,

  1. Почему PHP-код в ваш фрагмент кода? Является ли этот фрагмент кода источником из вашего приложения на основе Worklight? У вас там не может быть PHP ... Это мобильное приложение, работающее на вашем устройстве, а не на вашем сервере. Нет ничего, что могло бы интерпретировать этот код.

  2. В вашем приложении не должно использоваться следующее: поскольку Cordova является частью рамки Worklight, эта проверка выполняется внутренне. Вместо этого ваш код должен находиться внутри функции wlCommonInit() в main.js или вызываться оттуда.

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

Я подозреваю, что это, почему ничего не работает для вас. Попробуйте использовать AJAX, чтобы сделать запрос на сервер, получить отправленное изображение и сохранить его на своем веб-сервере.

+0

Код PHP - это фактически моя загрузка скрипт, который будет вызываться функцией 'ft.upload()'. Уже редактировал его в моем вопросе. Спасибо за головы. – imationyj