保存并上传多个图片

时间:2012-06-10 22:47:50

标签: android file-upload bitmap

我正在尝试上传从相机拍摄的多张图片。我通过Intent

给相机打电话
public void TakePicture(int actionCode)
    {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try
        {
            photo[0] = createTemporaryFile("spot", ".jpg");
        }
        catch(Exception e)
        {
            Log.v("ERROR SD!!", "Can't create file to take picture!");
            Toast.makeText(this, "Please check SD card! Image shot is impossible!", 10000);
        }

        fileUri = Uri.fromFile(photo[0]);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }

然后我将它上传到PHP服务器:

public void UploadImg()
    {
         HttpURLConnection conn = null;
         DataOutputStream dos = null;
         DataInputStream inStream = null; 

         // String exsistingFileName = "/sdcard/prueba.png";  --> Used for local files!!

         String lineEnd = "\r\n";
         String twoHyphens = "--";
         String boundary =  "*****";

         int bytesRead, bytesAvailable, bufferSize;
         byte[] buffer;
         int maxBufferSize = 1*1024*1024;
         String urlString = "http://myUrl.com/uploadimg.php";

         try
         {
             FileInputStream fileInputStream = new FileInputStream(photo[0].toString());

             // Open a URL connection to the Servlet
             URL url = new URL(urlString);

             // Open a HTTP connection to the URL
             conn = (HttpURLConnection) url.openConnection();

             conn.setDoInput(true);
             conn.setDoOutput(true);
             conn.setUseCaches(false);
             conn.setRequestMethod("POST");
             conn.setRequestProperty("Connection", "Keep-Alive");
             conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

             dos = new DataOutputStream(conn.getOutputStream());
             dos.writeBytes(twoHyphens + boundary + lineEnd);
             dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + photo[0] +"\"" + lineEnd);
             dos.writeBytes(lineEnd);

             // Create a buffer of maximum size
             bytesAvailable = fileInputStream.available();
             bufferSize = Math.min(bytesAvailable, maxBufferSize);
             buffer = new byte[bufferSize];

             // Read file and write it into form...
             bytesRead = fileInputStream.read(buffer, 0, bufferSize);

             while (bytesRead > 0)
             {
                 dos.write(buffer, 0, bufferSize);
                 bytesAvailable = fileInputStream.available();
                 bufferSize = Math.min(bytesAvailable, maxBufferSize);
                 bytesRead = fileInputStream.read(buffer, 0, bufferSize);
             }

             // Send multipart form data necesssary after file data...
             dos.writeBytes(lineEnd);
             dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

             // Close streams
             fileInputStream.close();
             dos.flush();
             dos.close();
         }
         catch (MalformedURLException ex) { Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); }
         catch (IOException ioe) { Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); }

      try {
            inStream = new DataInputStream (conn.getInputStream());
            String str;

            while ((str = inStream.readLine()) != null)
            {
                 System.out.println("Server Response" + str);
            }
            inStream.close();
        }
        catch (IOException ioex) { Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); }
    }

我保存了3张不同的图片:photo[0]photo[1]photo[2]。问题是,当我拍摄两张照片时,它只上传其中一张照片并使用size = 0

UploadImg()的代码中,我只显示photo[0],但在'真实'代码中,我在第一个for loop之后使用了try,以便上传所有拍摄的照片。

知道我做错了什么?

非常感谢你!

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题!我做了以下操作:我将其保存在带有图像位置的字符串中,而不是保存photo File

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                for (int u = 0; u <= 2; u++)
                {
                    if (savedImgs[u].equals(""))
                    {
                        // Saving important info to be used later
                        imgs = u + 1;
                        savedImgs[u] = photo.toString();
                        break;
                    }
                } ...

然后,在将图像上传到服务器时,我会像这样for loop

public void UploadImg()
    {
         HttpURLConnection conn = null;
         DataOutputStream dos = null;
         DataInputStream inStream = null; 

         // String exsistingFileName = "/sdcard/prueba.png";  --> Used for local files!!

         String lineEnd = "\r\n";
         String twoHyphens = "--";
         String boundary =  "*****";

         int bytesRead, bytesAvailable, bufferSize;
         byte[] buffer;
         int maxBufferSize = 1*1024*1024;
         String urlString = "http://myUrl.com/uploadimg.php";

         for (int n = 0; n < imgs; n++)
         {
            try
             {
                 FileInputStream fileInputStream = new FileInputStream(savedImgs[n]);

                 // Open a URL connection to the Servlet
                 URL url = new URL(urlString);

                 // Open a HTTP connection to the URL
                 conn = (HttpURLConnection) url.openConnection();

                 conn.setDoInput(true);
                 conn.setDoOutput(true);
                 conn.setUseCaches(false);
                 conn.setRequestMethod("POST");
                 conn.setRequestProperty("Connection", "Keep-Alive");
                 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

                 dos = new DataOutputStream(conn.getOutputStream());
                 dos.writeBytes(twoHyphens + boundary + lineEnd);
                 dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + savedImgs[n] +"\"" + lineEnd);
                 dos.writeBytes(lineEnd);

                 // Create a buffer of maximum size
                 bytesAvailable = fileInputStream.available();
                 bufferSize = Math.min(bytesAvailable, maxBufferSize);
                 buffer = new byte[bufferSize];

                 // Read file and write it into form...
                 bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                 while (bytesRead > 0)
                 {
                     dos.write(buffer, 0, bufferSize);
                     bytesAvailable = fileInputStream.available();
                     bufferSize = Math.min(bytesAvailable, maxBufferSize);
                     bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                 }

                 // Send multipart form data necesssary after file data...
                 dos.writeBytes(lineEnd);
                 dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                 // Close streams
                 fileInputStream.close();
                 dos.flush();
                 dos.close();
             }
             catch (MalformedURLException ex) { Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); }
             catch (IOException ioe) { Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); }

          try {
                inStream = new DataInputStream (conn.getInputStream());
                String str;

                while ((str = inStream.readLine()) != null)
                {
                     System.out.println("Server Response" + str);
                }
                inStream.close();
            }
            catch (IOException ioex) { Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); } 
         }
    }