如何在Android中发送帖子数据和文件?

时间:2014-12-15 10:05:31

标签: android forms post file-upload

我过去几天一直试图在Android中发布多部分表单,但我无法完全发送字符串数据和文件。我使用以下代码上传我的文件,它工作得很好。但是当我将请求字符串数据添加到我的请求时,它就会失败。

想象一下,我需要将profile_id=1234&text=HERE IS MY TEXT&global=0附加到请求中。我怎么能这样做?

String fileName = photoPath;

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;
try {

    // open a URL connection to the Servlet
    FileInputStream fileInputStream = new FileInputStream(new File(photoPath));
    URL url = new URL(Util.URL_POST_FEED);

    // 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("file", fileName);


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

    dos.writeBytes(twoHyphens + boundary + lineEnd);
    dos.writeBytes("Content-Disposition: form-data; name=\"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)
    int serverResponseCode = conn.getResponseCode();
    String serverResponseMessage = conn.getResponseMessage();


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

    if (serverResponseCode == 200) {

        runOnUiThread(new Runnable() {
            public void run() {


                Toast.makeText(c, "File Upload Complete.",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
    InputStream stream = conn.getInputStream();
    InputStreamReader isReader = new InputStreamReader(stream);

    //put output stream into a string
    BufferedReader br = new BufferedReader(isReader);
    Log.d("Read", br.readLine());
    //close the streams //
    fileInputStream.close();
    dos.flush();
    dos.close();

} catch (MalformedURLException ex) {

    ex.printStackTrace();

    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(c, "MalformedURLException",
                    Toast.LENGTH_SHORT).show();
        }
    });

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

    e.printStackTrace();

    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(c, "Got Exception : see logcat ",
                    Toast.LENGTH_SHORT).show();
        }
    });
    Log.e("Upload file to server Exception", "Exception : "
            + e.getMessage(), e);
}

1 个答案:

答案 0 :(得分:1)

检查this tutorial。希望它会有所帮助。

它使用自定义MultipartUtility类,手动创建要通过连接发送的请求正文。