现在要在安卓端用HttpURLConnection往服务器上传图片和文本,但是得附带一个用户名,用key1=value1&key2=value2的形式,但是getResponseCode()为500,服务器没问题,可能是请求头写错Content-Type了,改为pplication/x-www-form-urlencoded"后报415如下,代码如下,请大家指导下一下吧
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setConnectTimeout(3000);//设置连接超时
// con.setReadTimeout(5000); //不设置读取超时时间了,因为上传在服务端保存的时间不确定
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY);
如果想了解HttpURLConnection的用法的话,最好去看官方文档,或者去github搜相关demo, 或者google搜索HttpURLConnection upload picutres.
应该能得到很有价值的信息, 或者可靠的demo.
如果只是想实现上传需求的话,建议使用开源的网络库, API使用方便,做了了性能优化,而且稳定性好. 三年前,我了解到的开源库有okhttp, volley.
当然, 对于简单需求, 如果你希望项目轻, 不想引入外部依赖的话, 那还是使用标准API自己实现吧.
从上面代码中无法看出具体的问题所在
贴一段代码,可进行参考
String BOUNDARY = "Boundary-b1ed-4060-99b9-fca7ff59c113";
String ENTER = "\r\n";
String filePath = ""; //文件路径
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
URL url = new URL(urlStr);
//以下是内容
//第一部分是文件
String part1 = "--" + BOUNDARY
+ ENTER
+ "Content-Type: application/octet-stream" + ENTER
+ "Content-Disposition: form-data; filename=\"" + file.getName() + "\"; name=\"file\"" + ENTER + ENTER;
String param1="param1";
String param2="param2";
//第二部分为普通的参数
String part2 =
//参数1
+ ENTER
+ "--" + BOUNDARY + ENTER
+ "Content-Type: text/plain" + ENTER
+ "Content-Disposition: form-data; name=\"param1\"" + ENTER + ENTER
+ param1 + ENTER
+ "--" + BOUNDARY
//参数2
+ ENTER
+ "Content-Type: text/plain" + ENTER
+ "Content-Disposition: form-data; name=\"param2\"" + ENTER + ENTER
+ param2 + ENTER
+ "--" + BOUNDARY
//有多余参数可再次继续添加...
//最后结尾
+ "--";
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);;
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+BOUNDARY);
conn.setConnectTimeout(3000);
conn.connect();
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
dos.writeBytes(part1);
dos.write(bytes);
dos.writeBytes(part2);
dos.flush();
dos.close();
fis.close();
//如果服务器有返回信息,可通过此获取返回信息
InputStream is = conn.getInputStream();
byte[] b = new byte[1024];
int len;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len=is.read(b))>0) {
bos.write(b, 0, len);
}
String result = bos.toString("UTF-8"); //result即为返回信息
主要实现是根据带文件的form表单提交的内容如下: