我正在尝试构建http请求体,它会将图像以及一些参数从android设备发送到服务器。
现在发送图像就像它应该的那样工作,这是为此目的而建立http请求体的代码的一部分
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数组中检索的参数都是不成功的,但通常我尝试的是添加这个:
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"param1\"");
dos.writeBytes(lineEnd);
这是朝着正确方向迈出的一步吗?
答案 0 :(得分:6)
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
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;
}
}