Multipart transmission library on Android

There weren't many examples of simple and easy multi-part transmission, so I posted it instead of a memo.

Library body

PostMultipart.java


package com.app.sample;

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;

/**
 * Created by solid_red on 2017/03/13.
 */

public class PostMultipart {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;

    public PostMultipart(String requestURL, String charset)
            throws IOException {
        this.charset = charset;

        boundary = "===" + System.currentTimeMillis() + "===";
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true);
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }
    
    //Add form field
    public void addField(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();
    }

        //Add file
    public void addFile(String name, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + name
                        + "\"; 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();
    }
        
        //Add header
    public void addHeader(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }
    
    //Run
    public List<String> post() 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("Send Fail: " + status);
        }
        return response;
    }
}

How to use

try {
    //Initialize with upload destination and character code
    PostMultipart multipart = new PostMultipart("http://sample/upload/url", "UTF-8");

    //Normal parameter addition
    multipart.addField("hoge", "fuga");

    //For image files
    File picture_one = new File("/sample/picture/path.jpg ");
    multipart.addFile("file1", picture_one);

    //For multiple image files(It is assumed that the imageList contains multiple file paths)
    for (int i = 0; i < imageList.size(); i++) {
        File picture_multi = new File(imageList.get(i));
        multipart.addFile("file2[]", picture_multi);
    }
    
    //Get list for each response line
    List<String> response = multipart.post();
} catch (IOException e) {
    Log.e("ERROR", e.getMessage());
}

Released under the MIT license

Recommended Posts

Multipart transmission library on Android
Android CSV library
Android SIP Library
[Android] Notes on xml
[Android Studio] I want to use Maven library on Android
I made a library for displaying tutorials on Android.
Customize list view on Android
Use serial communication on Android
ROS app development on Android
Android library collection of "Mercariatte"
Use native code on Android
Event handling with RxBus on Android
How to "hollow" View on Android
Bridge commentary on React Native Android
[Android] Get the date on Monday
Get JUnit code coverage on Android.
Library collection useful for Android development
Watson Assistant (formerly Conversation) on Android
Notes on calling Installer on Android App
Save ArrayList using GSON on Android
Notes on Android (java) thread processing
[Android] Receive intent on Broadcast Reciever
Implement ripple representation on images on Android
Speed up location acquisition on Android