How to put HTTP multipart request body together in order to send some string parameters along with image

…衆ロ難τιáo~ 提交于 2019-12-11 09:27:57

问题


I'm trying to build http request body which will send image along with some parameters from android device to server.

For now sending an image works like it should, and this is the part of the code which bulds http request body for that purpose

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);

My every attempt to add params which I would retrieve from POST array was unsuccesseful, but generally what I was trying is to add this:

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

Is this the step in the right direction anyway?


回答1:


    HashMap<String, String> formValues = new HashMap<String, String>();
        HashMap<String, String> fileValues = new HashMap<String, String>(); 

        formValues.put("text_request_parameter", f_name);       
            fileValues.put("file_request_parameter", file_path);

                WebServiceUtil wUtil = new WebServiceUtil(this, serverUri, formValues,true, fileValues);
            /*if you want to request text only
                /WebServiceUtil wUtil = new WebServiceUtil(this, serverUri, formValues,false, fileValues);*/

        wUtil.execute();

// WebServiceUtil.java 

    import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class WebServiceUtil extends AsyncTask<String, Integer, String> {

    HashMap<String, String> formValues;
    HashMap<String, String> fileValues;

    Boolean uploadFile;
    String reqUrl;
    String result;
    ProgressDialog dialog;
    Context context;

    public WebServiceUtil(Context context, String reqUrl,
            HashMap<String, String> formValues, Boolean uploadFile,
            HashMap<String, String> fileValues) {

        this.context = context;
        this.reqUrl = reqUrl;
        this.formValues = formValues;

        this.uploadFile = uploadFile;
        if (uploadFile) {

            this.fileValues = fileValues;
        }
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

    }

    //

    @Override
    protected String doInBackground(String... URLs) {

        List<String> response = null;
        try {
            MultipartUtility mu = new MultipartUtility(context, reqUrl, "UTF-8");

            for (Map.Entry<String, String> entry : formValues.entrySet()) {
                String key = entry.getKey();

                String value = entry.getValue();

                mu.addFormField(key, value);

            }

            if (uploadFile) {

                for (Map.Entry<String, String> entry : fileValues.entrySet()) {
                    String key = entry.getKey();

                    String value = entry.getValue();

                    File file = new File(value);
                    mu.addFilePart(key, file);

                }

            }

            response = mu.finish();

        } catch (IOException e) {

            e.printStackTrace();
        }

        return response.toString();

    }

    protected void onPostExecute(String result) {

    }

}

MultipartUtility.java adapted from codejava.net

import java.io.BufferedReader;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import android.app.ProgressDialog;
import android.content.Context;

/**
 * This utility class provides an abstraction layer for sending multipart HTTP
 * POST requests to a web server. 
 * @author www.codejava.net
 *
 */
public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
    ProgressDialog dialog;

    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(Context context,String requestURL, String charset)
            throws IOException {
        //dialog = new ProgressDialog(context);
        this.charset = charset;

        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";

        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }

    /**
     * Adds a form field to the request
     * @param name field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Adds a upload file section to the request
     * @param fieldName name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + fieldName
                        + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();

        writer.append(LINE_FEED);
        writer.flush();    
    }

    /**
     * Adds a header field to the request.
     * @param name - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Completes the request and receives response from the server.
     * @return a list of Strings as response in case the server returned
     * status OK, otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {


        List<String> response = new ArrayList<String>();

        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();

        // checks server's status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }


        return response;
    }
}


来源:https://stackoverflow.com/questions/25529483/how-to-put-http-multipart-request-body-together-in-order-to-send-some-string-par

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!