Android realizes multi parameter file and data upload

  • 2021-10-27 09:11:44
  • OfStack

In this paper, we share the specific code of Android to realize multi-parameter files and data uploading for your reference. The specific contents are as follows

On the code:


/**
 *  Multiple pictures and parameters can be passed in 
 * 
 * @param actionUrl
 *    Sending address 
 * @param params
 *    Text parameter 
 * @param files
 *    File parameters 
 * @return
 * @throws IOException
 */
 public static String mulpost(String actionUrl, Map<String, String> params,
 Map<String, File> files) throws IOException {
 String result = "";
 
 String BOUNDARY = java.util.UUID.randomUUID().toString();
 String PREFIX = "--", LINEND = "\r\n";
 String MULTIPART_FROM_DATA = "multipart/form-data";
 String CHARSET = "UTF-8";
 URL uri = new URL(actionUrl);
 HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
 conn.setReadTimeout(5 * 1000);
 conn.setDoInput(true);//  Allow input 
 conn.setDoOutput(true);//  Allow output 
 conn.setUseCaches(false);
 conn.setRequestMethod("POST"); // Post Mode 
 conn.setRequestProperty("connection", "keep-alive");
 conn.setRequestProperty("Charsert", "UTF-8");
 conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
 + ";boundary=" + BOUNDARY);
 
 //  First, group the parameters of the text type 
 StringBuilder sb = new StringBuilder();
 for (Map.Entry<String, String> entry : params.entrySet()) {
 sb.append(PREFIX);
 sb.append(BOUNDARY);
 sb.append(LINEND);
 sb.append("Content-Disposition: form-data; name=\""
  + entry.getKey() + "\"" + LINEND);
 sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
 sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
 sb.append(LINEND);
 sb.append(entry.getValue());
 sb.append(LINEND);
 }
 
 DataOutputStream outStream = new DataOutputStream(
 conn.getOutputStream());
 outStream.write(sb.toString().getBytes());
 
 //  Send file data 
 if (files != null)
 for (Map.Entry<String, File> file : files.entrySet()) {
 StringBuilder sb1 = new StringBuilder();
 sb1.append(PREFIX);
 sb1.append(BOUNDARY);
 sb1.append(LINEND);
 sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
  + file.getKey() + "\"" + LINEND);
 sb1.append("Content-Type: application/octet-stream; charset="
  + CHARSET + LINEND);
 sb1.append(LINEND);
 outStream.write(sb1.toString().getBytes());
 InputStream is = new FileInputStream(file.getValue());
 byte[] buffer = new byte[1024];
 int len = 0;
 while ((len = is.read(buffer)) != -1) {
  outStream.write(buffer, 0, len);
 }
 
 is.close();
 outStream.write(LINEND.getBytes());
 }
 
 //  Request end flag 
 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
 outStream.write(end_data);
 outStream.flush();
 
 InputStream is = conn.getInputStream();
 InputStreamReader isr = new InputStreamReader(is, "utf-8");
 BufferedReader br = new BufferedReader(isr);
 result = br.readLine();
 outStream.close();
 conn.disconnect();
 return result;
 }

This is the way.

When you use it, you can encapsulate it in your own class and call it directly. Remember to add network access and read the permissions of system files.


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Because uploading is a time-consuming operation, it must be called in another thread.


Related articles: