2015-04-02 3 views
0

Я попытался загрузить несколько изображений на сервер. Я могу щелкнуть изображения и отобразить их в блоке, но не могу передать их на сервер. Ошибка я получаю 04-02 10:35:41.984: I/chromium(23772): [INFO:CONSOLE(104)] "Uncaught TypeError: Cannot call method 'lastIndexOf' of undefined", source: file:///android_asset/www/index.html (104)Загрузка нескольких изображений на сервер в Кордове

Код:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Submit form</title> 

    <script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
    <script type="text/javascript" charset="utf-8"> 

    var pictureSource; // picture source 
    var destinationType; // sets the format of returned value 

    // Wait for device API libraries to load 
    // 
    document.addEventListener("deviceready",onDeviceReady,false); 

    // device APIs are available 
    // 
    function onDeviceReady() { 
     pictureSource = navigator.camera.PictureSourceType; 
     destinationType = navigator.camera.DestinationType; 
    } 


    // Called when a photo is successfully retrieved 
    // 
    /* function onPhotoURISuccess(imageURI) { 

     // Show the selected image 
     var smallImage = document.getElementById('smallImage'); 
     smallImage.style.display = 'block'; 
     smallImage.src = imageURI; 
    }*/ 

    function onPhotoDataSuccess1(imageData) { 

     var smallImage1 = document.getElementById('smallImage1'); 
     smallImage1.style.display = 'block'; 
     smallImage1.src = "data:image/jpeg;base64," + imageData; 
    } 
    function onPhotoDataSuccess2(imageData) { 

     var smallImage2 = document.getElementById('smallImage2'); 
     smallImage2.style.display = 'block'; 
     smallImage2.src = "data:image/jpeg;base64," + imageData; 
    } 
    function onPhotoDataSuccess3(imageData) { 

     var smallImage3 = document.getElementById('smallImage3'); 
     smallImage3.style.display = 'block'; 
     smallImage3.src = "data:image/jpeg;base64," + imageData; 
    } 

    function capturePhoto1() { 
     // Take picture using device camera and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess1, onFail, { quality: 20, 
      destinationType: destinationType.DATA_URL, 

      }); 
     } 
     function capturePhoto2() { 
     // Take picture using device camera and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess2, onFail, { quality: 20, 
      destinationType: destinationType.DATA_URL, 

      }); 
     } 
     function capturePhoto3() { 
     // Take picture using device camera and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess3, onFail, { quality: 20, 
      destinationType: destinationType.DATA_URL, 

      }); 
     } 

    // A button will call this function 
    /* 
    function getPhoto(source) { 
     // Retrieve image file location from specified source 
     navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 20, 
     destinationType: destinationType.FILE_URI, 
     sourceType: source }); 
    }*/ 

    //selected photo URI is in the src attribute (we set this on getPhoto) 
     var imageURI1 = document.getElementById('smallImage1').getAttribute("src"); 
     var imageURI2 = document.getElementById('smallImage2').getAttribute("src"); 
     var imageURI3 = document.getElementById('smallImage3').getAttribute("src"); 
     if (!imageURI1) { 
      alert('Please select an image first.'); 
      return; 
     } 

     var items = [imageURI1,imageURI2,imageURI3]; 
     $.each(items,function(){ 
      uploadPhoto($(this)); 
     }); 


    function uploadPhoto(imageURI) { 

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

     options.params = { 
      firstname: document.getElementById("firstname").value, 
      lastname: document.getElementById("lastname").value, 
      workplace: document.getElementById("workplace").value 
     } 

     var ft = new FileTransfer(); 
     ft.upload(imageURI, encodeURI("http://www.xyz.co/AppData/upload.php"), win, fail, options); 
    } 

    // Called if something bad happens. 
    // 
    function onFail(message) { 
     console.log('Failed because: ' + message); 
    } 

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

    function fail(error) { 
     alert("An error has occurred: Code = " + error.code); 
     console.log("upload error source " + error.source); 
     console.log("upload error target " + error.target); 
    } 

    </script> 
    </head> 
    <body> 
    <form id="regform"> 


     <input type="button" onclick="capturePhoto1();" value="Capture Photo"><br> 
     <img style="display:none;width:60px;height:60px;" id="smallImage1" src="" /> 

     <input type="button" onclick="capturePhoto2();" value="Capture Photo"><br> 
     <img style="display:none;width:60px;height:60px;" id="smallImage2" src="" /> 

     <input type="button" onclick="capturePhoto3();" value="Capture Photo"><br> 
     <img style="display:none;width:60px;height:60px;" id="smallImage3" src="" /> 

     First Name: <input type="text" id="firstname" name="firstname"><br> 
     Last Name: <input type="text" id="lastname" name="lastname"><br> 
     Work Place: <input type="text" id="workplace" name="workPlace"><br> 
     <input type="button" id="btnSubmit" value="Submit" onclick="uploadPhoto();"> 
    </form> 
    </body> 
</html> 

Я предполагаю, что есть какая-то проблема в function uploadPhoto(). Цикл Foreach не правильно обрабатывает imageURI. Что может быть решением?

ответ

2

Пожалуйста, смотрите, если это поможет вам. ваша функция uploadPhoto имеет параметр imageURI, но вы вызываете функцию uploadPhoto() при нажатии кнопки без прохождения каких-либо параметров. ваша функция должна быть

function intUpload(){ 
     var imageURI1 = document.getElementById('smallImage1').getAttribute("src"); 
     var imageURI2 = document.getElementById('smallImage2').getAttribute("src"); 
     var imageURI3 = document.getElementById('smallImage3').getAttribute("src"); 
     if (!imageURI1) { 
      alert('Please select an image first.'); 
      return; 
     } 

     var items = [imageURI1,imageURI2,imageURI3]; 
     $.each(items,function(){ 
      uploadPhoto($(this)); 
     }); 
} 

function uploadPhoto(imageURI) { 
    //set upload options 
    var d = new Date(); 
    var options = new FileUploadOptions(); 
    options.fileKey = "vImage" + d.getTime(); 
    options.fileName = imageURI.substr(imageURI.lastIndexOf('/')+1); 
    options.mimeType = "image/jpeg"; 

    options.params = { 
     firstname: document.getElementById("firstname").value, 
     lastname: document.getElementById("lastname").value, 
     workplace: document.getElementById("workplace").value 
    }; 
    options.chunkedMode = false; 

    var ft = new FileTransfer(); 
    ft.upload(imageURI, encodeURI("http://www.xyz.co/AppData/upload.php"), win, fail, options); 
} 

и ваши нажатия кнопка должна быть

<input type="button" id="btnSubmit" value="Submit" onclick="intUpload();"> 

также ваш HTML страница не содержит какой-либо jquery файла, но вы используете функцию $.each Jquery. пожалуйста, включите файл Jquery

+0

Как я могу восстановить это на стороне сервера ?? Я пробовал следующий код '$ new_image_name = array (" red.jpg "," green.jpg "," blue.jpg "); foreach ($ new_image_name as $ value) { $ destination = $ _SERVER ['DOCUMENT_ROOT']. «/AppData/uploads/".$value; move_uploaded_file ($ _ FILES ["file"] ["tmp_name"], $ destination); } ', но загружается только 1 изображение (red.jpg). –

+0

, пожалуйста, проверьте функцию загрузки chunkedMode и параметр fileKey, извините за серверную часть, я использую asp.net mvc. – Ashokbharathi

+0

проверьте этот пост. http://stackoverflow.com/questions/13860405/how-to-retrieve-post-data-from-phonegaps-file-transfer-api – Ashokbharathi

0

<script type="text/javascript" charset="utf-8"> 
 
      ///// photo for 1 photo 
 
\t \t 
 
      var pictureSource; // picture source 
 
      var destinationType; // sets the format of returned value 
 

 
      // Wait for device API libraries to load 
 
      // 
 
      document.addEventListener("deviceready",onDeviceReady,false); 
 

 
      // device APIs are available 
 
      // 
 
      function onDeviceReady() 
 
      { 
 
       pictureSource=navigator.camera.PictureSourceType; 
 
       destinationType=navigator.camera.DestinationType; 
 
      } 
 

 
      // Called when a photo is successfully retrieved 
 
\t \t 
 
\t \t 
 
\t \t 
 
      var x=0; 
 
      function onPhotoDataSuccess(imageURI) 
 
      { 
 
       x++; 
 
       // Uncomment to view the base64-encoded image data 
 
       console.log(imageURI); 
 
\t \t \t 
 
       // Get image handle 
 
       // 
 
       var y = 'smallImage'+x; 
 
       var smallImage = document.getElementById(y); 
 
\t \t 
 
       smallImage.src = "data:image/jpeg;base64," + imageURI; 
 
       // Unhide image elements 
 
       // 
 
       smallImage.style.display = 'block'; 
 

 
\t \t 
 
       // Show the captured photo 
 
       // The in-line CSS rules are used to resize the image 
 
       // 
 
       //var fso=new ActiveXObject("Scripting.FileSystemObject"); 
 
       //fso.CopyFile("data:image/jpeg;base64," + imageURI,"file:///storage/sdcard/DCIM/"); 
 
\t \t 
 
\t \t 
 
      } 
 

 
      // Called when a photo is successfully retrieved 
 
      // 
 
\t \t 
 
      function onPhotoURISuccess(imageURI) 
 
      { 
 
       x++; 
 
       // Uncomment to view the base64-encoded image data 
 
       console.log(imageURI); 
 
       //alert(imageURI); 
 
       // Get image handle 
 
       // 
 
       var y = 'smallImage'+x; 
 
       var smallImage = document.getElementById(y); 
 
       //alert(smallImage); 
 
       smallImage.src = imageURI; 
 
       // Unhide image elements 
 
       // 
 
       smallImage.style.display = 'block'; 
 

 

 
\t \t 
 
       //alert(smallImage.src) 
 
      } 
 

 
      // A button will call this function 
 
      // 
 
      function capturePhoto() 
 
      { 
 
       // Take picture using device camera and retrieve image as base64-encoded string 
 
       navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, 
 
        destinationType: destinationType.DATA_URL }); 
 
      } 
 

 
      // A button will call this function 
 
      // 
 
\t \t 
 
      function capturePhotoEdit() 
 
      { 
 
       // Take picture using device camera, allow edit, and retrieve image as base64-encoded string 
 
       navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, allowEdit: true, 
 
        destinationType: destinationType.DATA_URL }); 
 
      } 
 

 
\t \t 
 
      // A button will call this function 
 
      // 
 
      function getPhoto() 
 
      { 
 
       // Retrieve image file location from specified source 
 
       navigator.camera.getPicture(onPhotoDataSuccess, onFail, { 
 
        quality: 50, 
 
        allowEdit: true, 
 
        destinationType: Camera.DestinationType.DATA_URL, 
 
        sourceType: Camera.PictureSourceType.SAVEDPHOTOALBUM 
 
       }); 
 
       /* window.imagePicker.getPictures(
 
       function(results) { 
 
         for (var i = 0; i < results.length; i++) { 
 
           console.log('Image URI: ' + results[i]); 
 
           alert('Image URI: ' + results[i]); 
 
         } 
 
       }, function (error) { 
 
         console.log('Error: ' + error); 
 
       }, { 
 
         maximumImagesCount: 4, 
 
         width: 800 
 
       }*/ 
 
      } 
 

 
      // Called if something bad happens. 
 
      // 
 
      function onFail(message) 
 
      { 
 
       alert('Failed because: ' + message); 
 
      } 
 

 
     </script>