simple HttpURLConnection POST file multipart/form-data from android to google blobstore simple HttpURLConnection POST file multipart/form-data from android to google blobstore android android

simple HttpURLConnection POST file multipart/form-data from android to google blobstore


I am using HttpURLConnection to achieve this.

Create one Multipart custom class ::

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;    /**     * 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(String requestURL, String charset)            throws IOException {        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);        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;    }}

Use it (async way) ::

    MultipartUtility multipart = new MultipartUtility(requestURL, charset);    // In your case you are not adding form data so ignore this                /*This is to add parameter values */                for (int i = 0; i < myFormDataArray.size(); i++) {                    multipart.addFormField(myFormDataArray.get(i).getParamName(),                            myFormDataArray.get(i).getParamValue());                }//add your file here.                /*This is to add file content*/                for (int i = 0; i < myFileArray.size(); i++) {                    multipart.addFilePart(myFileArray.getParamName(),                            new File(myFileArray.getFileName()));                }                List<String> response = multipart.finish();                Debug.e(TAG, "SERVER REPLIED:");                for (String line : response) {                    Debug.e(TAG, "Upload Files Response:::" + line);// get your server response here.                    responseString = line;                }


use okhttp and use following snippet (taken from recipes)

adjust the header values according to what your server expects.

private static final String IMGUR_CLIENT_ID = "...";private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {// Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image    RequestBody requestBody = new MultipartBuilder()    .type(MultipartBuilder.FORM)    .addPart(        Headers.of("Content-Disposition", "form-data; name=\"title\""),        RequestBody.create(null, "Square Logo"))    .addPart(        Headers.of("Content-Disposition", "form-data; name=\"image\""),        RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))    .build();Request request = new Request.Builder()    .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)    .url("https://api.imgur.com/3/image")    .post(requestBody)    .build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);System.out.println(response.body().string());}


As alternative you can use Retrofit.

You can specify a call like this:

@Multipart@POST("/user/photo")Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

then create it like this:

Retrofit retrofit = new Retrofit.Builder()    .baseUrl("https://api.github.com")    .build();GitHubService service = retrofit.create(GitHubService.class);

and finally execute it like this:

service.updateUser(Photo, description).enqueue() --> asynchronous

service.updateUser(Photo, description).execute() --> synchronous

See the documentation here