0

phone-gap android バージョンでは、電話でキャプチャした画像をアップロードできません。iOS では問題なく動作しますが、電話ギャップを使用する Android バージョンでは同じコードが動作しません

200 の応答コードを受け取りましたが、サーバーから「成功」の応答がありません。

私は cordova-1.7.0.js を使用しており、ターゲット SDK は Android 2.1 です。

サンプルコードは次のとおりです。

function imageUpload(imageURI)
{
    var options = new FileUploadOptions();
    options.fileKey="image";
    options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
    options.mimeType="image/jpeg";
    var params = new Object();
    var msg="test message";
    var token= "test token";
    params.message = msg;
    params.access_token = token;
    options.params = params;
    var ft = new FileTransfer();
    ft.upload(imageURI, "http://mydomain.info/demo/upload.php", win, fail, options,false);
}
4

5 に答える 5

1

また、Androidエミュレーターにカメラ権限を追加することを忘れないでください

HTML コード:

<!DOCTYPE html>
<html>
    <head>
        <title>Login Page</title>
              <meta name="viewport" content="width=device-width, initial-scale=1">

     <script type="text/javascript" charset="utf-8" src="cordova-1.9.0.js"></script>
     <link rel="stylesheet"
href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
     <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script
src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>

    <script type="text/javascript">


        function PictureSourceType() {};
        PictureSourceType.PHOTO_LIBRARY = 0;
        PictureSourceType.CAMERA = 1;

        function getPicture(sourceType)
        {
             var options = { quality: 10 };
             if (sourceType != undefined) {
                  options["sourceType"] = sourceType;
                 // options["destinationType"] = destinationType.DATA_URL;
             }
             // if no sourceType specified, the default is CAMERA 
             navigator.camera.getPicture(getPicture_Success, null, options);
        };


        function getPicture_Success(imageData)
        {
                 alert("getpic success "+ imageData);
                document.getElementById("test_img").src =  imageData;
        };

        function success(response) {
            alert("Your photo has been uploaded!");
          };
          // callback if the photo fails to upload successfully.

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

        function uploadPhoto()
        {
            var imageFile = document.getElementById("test_img").src;
            alert(imageFile);




            var ft,options;


            options = new FileUploadOptions();
            options.fileKey = "profile_image";
              // name of the file:
              options.fileName = imageFile.substr(imageFile.lastIndexOf('/') + 1);
              // mime type:
              options.mimeType = "multipart/form-data";
              params = {
                val1: "some value",
                val2: "some other value"
              };
              options.params = params;



            ft = new FileTransfer();
            ft.upload(imageFile, 'http://10.0.2.2:8080/cio/uploadpic', success, fail, options);
            alert("There is something called file transfer " + imageFile);

        };

       </script>
        </head>

         <body>
     <div data-role="page" id="cameraPage">
    <div data-role="header" data-position="inline">
        <h1>Edit profile Pic</h1>
        <a href="index.html" data-icon="delete" class="ui-btn-right">Cancel</a>
    </div>

    <div data-role="content">
        <center>
        <img style="width: 60px; height: 60px" id="test_img" src="" />
        </center>

        <button onclick="getPicture()">From Camera</button>

        <button onclick="getPicture(PictureSourceType.PHOTO_LIBRARY)">From
            Photo Library</button>
        <button onclick="uploadPhoto()">Upload Photo</button>


    </div>

</div>

于 2012-07-27T22:33:33.483 に答える
1

まず、doPost メソッドが呼び出されていることを確認します。呼び出されていない場合は、doGet() メソッドを記述し、その呼び出し内で次のように投稿します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    doPost(request,response);
} 

次に、次の jar ファイルを WEB-INF の下の lib フォルダーに配置する必要があります。

  1. commons-fileupload-1.2.2.jar
  2. commons-fileupload-1.2-javadoc.jar
  3. commons-fileupload-1.2-sources.jar
  4. commons-io-1.3.2.jar

また、それらをビルド パスに配置します。

于 2012-10-23T10:48:12.237 に答える
0

さて、Cordova-1.9.0 に apache ライブラリを追加します: commons-io-2.4.JARS

phonegap Androidエミュレーターからサーブレットに画像をアップロードして画像を保存しようとしています

サーブレット コード: uploadpic.java

private static final String BASE_DIRECTORY = "/Users/tshah/Pictures";

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//  boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    System.out.println("Do post....");

    /**
    * The base upload directory. In this directory all uploaded files will
    * be stored. With the applet param tag 'directory' you can create a
    * subdirectory for a user. 
    * See http://www.javaatwork.com/parameters.html#directory for more 
    * information about the 'directory' param tag. For a Windows environment 
    * the BASE_DIRECTORY can be e.g. * 'c:/temp' for Linux environment '/tmp'.
    */


    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    // check if the http request is a multipart request
    // with other words check that the http request can have uploaded files
    if (isMultipart) {

      //  Create a factory for disk-based file items
      FileItemFactory factory = new DiskFileItemFactory();

      //  Create a new file upload handler
      ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

      // Set upload parameters
      // See Apache Commons FileUpload for more information
      // http://jakarta.apache.org/commons/fileupload/using.html
      servletFileUpload.setSizeMax(-1);

      try {

        String directory = "";

        // Parse the request
        List items = servletFileUpload.parseRequest(request);

        // Process the uploaded items
        Iterator iter = items.iterator();

        while (iter.hasNext()) {
          FileItem item = (FileItem) iter.next();

          // the param tag directory is sent as a request parameter to
          // the server
          // check if the upload directory is available
          if (item.isFormField()) {

            String name = item.getFieldName();

            if (name.equalsIgnoreCase("directory")) {

              directory = item.getString();
            }

            // retrieve the files
          } else {

            // the fileNames are urlencoded
            String fileName = URLDecoder.decode(item.getName());

            File file = new File(directory, fileName+".jpeg");
            file = new File(BASE_DIRECTORY, file.getPath());

            // retrieve the parent file for creating the directories
            File parentFile = file.getParentFile();

            if (parentFile != null) {
              parentFile.mkdirs();
            }

            // writes the file to the filesystem
            item.write(file);
          }
        }

      } catch (Exception e) {
        e.printStackTrace();
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
      }

      response.setStatus(HttpServletResponse.SC_OK);

    } else {
      response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    }
}
于 2012-07-27T22:29:27.693 に答える
0

ここで私の答えを参照してください。完全なコードについては、これはAndroidで機能します(画像とデータをdjango rest apiに送信します):

android phonegap カメラと画像のアップロード

トリックは次のとおりだと思います。

options.chunkedMode = true; //this is important to send both data and files

そして多分これ:

var url=encodeURI("http://your_url_for_the_post/");

URL エンコードされた URL を使用して FileTransfer に渡します

于 2013-07-25T09:30:15.943 に答える