2015-01-26 3 views
0

IBM Worklight 6.2.0 및 Cordova 버전 3.4.0을 사용하여 빌드 된 안드로이드 하이브리드 응용 프로그램의 로컬 웹 서버 (wampserver를 사용하여 호스트 됨)에 이미지 파일을 업로드하는 데 문제가 있습니다. 코드 조각은 다음과 같습니다 :코르도바 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); ?> 

내가 HTTP 상태 200 에러 코드를 그 외에 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를 추가했는지 확인하십시오. 이미 AndroidManifest.xml에 MANAGE_DOCUMENTS 권한을 추가했음을 잊어 버렸습니다.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); 
?> 

당신은 장치의 사진 라이브러리를 열려면 HTML에서 $scope.getImage 함수를 호출해야합니다.

0

에 다음을 추가 한, 당신이 어떻게 든이 문제를 해결 보인다 - 당신이 대답으로 그것을 공유해야합니다. 에 관계없이

,

  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를 사용하여 서버에 요청을 보내고, 보낸 이미지를 받아서 웹 서버에 저장하십시오.

+0

PHP 코드는 실제로 내 업로드 스크립트는'ft.upload()'함수에 의해 호출 될 것이다. 이미 내 질문에 그것을 편집했습니다. 머리를 가져 주셔서 감사합니다. – imationyj

관련 문제