ANDROID中如何使用java.net.URLConnection同时发送图像和数据?

3
我使用java.net.URLConnection以POST方式将图像和一些参数发送到服务器。 我的代码可以将图像成功发送到服务器,但我有点困惑如何在同一时间附加一些参数并发送到服务器。 我已经遵循了这里这里的方法,但我认为它与我的代码不同。
以下是我的代码片段:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.widget.Toast;

import com.yai.app.support.DialogHandler;

public class ThreadImageUploader {
    private int serverResponseCode = 0;
    private ProgressDialog dialog;
    private Activity activity;

    public ThreadImageUploader(ProgressDialog mProgressDialog, Activity mActivity){
        dialog = mProgressDialog;
        activity = mActivity;
    }

    public int uploadFile(final String sourceFileUri, final String upLoadServerUri) {
        String fileName = sourceFileUri;

        HttpURLConnection conn = null;
        DataOutputStream dos = null;  
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024; 
        File sourceFile = new File(sourceFileUri); 

        if (!sourceFile.isFile()) {             
             dialog.dismiss(); 

             Log.e("uploadFile", "Source File not exist : " + sourceFileUri);

             activity.runOnUiThread(new Runnable() {
                 public void run() {
                     new DialogHandler().customDialog(activity, "ERROR", "Source File not exist : " + sourceFileUri);
                 }
             }); 

             return 0;

        }
        else{
             try { 
                 // open a URL connection to the Servlet
                 FileInputStream fileInputStream = new FileInputStream(sourceFile);
                 URL url = new URL(upLoadServerUri);

                 // Open a HTTP  connection to  the URL
                 conn = (HttpURLConnection) url.openConnection(); 
                 conn.setDoInput(true); // Allow Inputs
                 conn.setDoOutput(true); // Allow Outputs
                 conn.setUseCaches(false); // Don't use a Cached Copy
                 conn.setRequestMethod("POST");
                 conn.setRequestProperty("Connection", "Keep-Alive");
                 conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                 conn.setRequestProperty("uploaded_file", fileName); 

                 dos = new DataOutputStream(conn.getOutputStream());

                 dos.writeBytes(twoHyphens + boundary + lineEnd); 
                 dos.writeBytes("Content-Disposition: form-data; name='uploaded_file';filename='"
                                           + fileName + "'" + 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);

                 // Responses from the server (code and message)
                 serverResponseCode = conn.getResponseCode();
                 String serverResponseMessage = conn.getResponseMessage();

                 Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);

                 if(serverResponseCode == 200){
                     activity.runOnUiThread(new Runnable() {
                          public void run() {
                              String message = "File Upload Completed.";                               
                              Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
                          }
                      });                
                 }    

                 //close the streams //
                 fileInputStream.close();
                 dos.flush();
                 dos.close();

            } catch (MalformedURLException ex) {
                dialog.dismiss();  
                ex.printStackTrace();

                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(activity, "MalformedURLException : : check script url.", Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  
            } catch (Exception e) {
                dialog.dismiss();  
                e.printStackTrace();

                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(activity, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e);  
            }
            dialog.dismiss();       
            return serverResponseCode; 

         }
       } 
}

我该如何同时发送图片和一些参数到服务器?非常感谢。
1个回答

6
最终,这是我问题的解决方案。下面的代码片段可用于上传图像并将文本发送到服务器。也许这篇文章可以帮助其他人 :)
以下是代码:
public int uploadFile(final String sourceFileUri, final String upLoadServerUri, final String renameFile) {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;  
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024; 
        File sourceFile = new File(sourceFileUri); 

        if (!sourceFile.isFile()) {             
             dialog.dismiss(); 

             Log.e("uploadFile", "Source File not exist : " + sourceFileUri);

             activity.runOnUiThread(new Runnable() {
                 public void run() {
                     new DialogHandler().customDialog(activity, "ERROR", "Source File not exist : " + sourceFileUri);
                 }
             }); 

             return 0;

        }
        else{
             try {               
                 // open a URL connection to the Servlet
                 FileInputStream fileInputStream = new FileInputStream(sourceFile);
                 URL url = new URL(upLoadServerUri);

                 // Open a HTTP  connection to  the URL
                 conn = (HttpURLConnection) url.openConnection(); 
                 conn.setDoInput(true); // Allow Inputs
                 conn.setDoOutput(true); // Allow Outputs
                 conn.setUseCaches(false); // Don't use a Cached Copy
                 conn.setRequestMethod("POST");
                 conn.setRequestProperty("Connection", "Keep-Alive");
                 conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

                 conn.setRequestProperty("uploaded_file", renameFile); 

                 dos = new DataOutputStream(conn.getOutputStream());

                 // add parameters
                 dos.writeBytes(twoHyphens + boundary + lineEnd);
                 dos.writeBytes("Content-Disposition: form-data; name=\"type\""
                         + lineEnd);
                 dos.writeBytes(lineEnd);

                 // assign value
                 dos.writeBytes("Your value");
                 dos.writeBytes(lineEnd);
                 dos.writeBytes(twoHyphens + boundary + lineEnd);

                 // send image
                 dos.writeBytes(twoHyphens + boundary + lineEnd); 
                 dos.writeBytes("Content-Disposition: form-data; name='uploaded_file';filename='"
                         + renameFile + "'" + 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);

                 // Responses from the server (code and message)
                 serverResponseCode = conn.getResponseCode();
                 String serverResponseMessage = conn.getResponseMessage();

                 Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);

                 if(serverResponseCode == 200){
                     activity.runOnUiThread(new Runnable() {
                          public void run() {
                              String message = "File Upload Completed.";                               
                              Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
                          }
                      });                
                 }    

                 //close the streams //
                 fileInputStream.close();
                 dos.flush();
                 dos.close();

            } catch (MalformedURLException ex) {
                dialog.dismiss();  
                ex.printStackTrace();

                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(activity, "MalformedURLException : : check script url.", Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  
            } catch (Exception e) {
                dialog.dismiss();  
                e.printStackTrace();

                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(activity, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e);  
            }
            dialog.dismiss();       
            return serverResponseCode; 

         }
       } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接