如何将HTTP多部分请求体放在一起,以便与图像一起发送一些字符串参数

编程入门 行业动态 更新时间:2024-10-24 22:26:21
本文介绍了如何将HTTP多部分请求体放在一起,以便与图像一起发送一些字符串参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试构建http请求体,它会将图像以及一些参数从android设备发送到服务器。

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

现在发送图像就像它应该的那样工作,这是为此目的而放置http请求体的代码的一部分

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

我每次尝试添加从POST数组中检索的参数都是不成功的,但一般来说我是什么尝试是添加这个:

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?

推荐答案

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改编自 codejava

MultipartUtility.java adapted from codejava

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.HttpURLConnection; import java.URL; import java.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 * */ 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; } }

更多推荐

如何将HTTP多部分请求体放在一起,以便与图像一起发送一些字符串参数

本文发布于:2023-11-26 08:14:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1633330.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   如何将   放在一起   便与   图像

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!