Created
October 22, 2014 06:41
-
-
Save goodev/688b51a5140ff908f6b6 to your computer and use it in GitHub Desktop.
Java Android 上传文件
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class HttpPostUtil { | |
URL url; | |
HttpURLConnection conn; | |
String boundary = "--------httppost123"; | |
Map<String, String> textParams = new HashMap<String, String>(); | |
Map<String, File> fileparams = new HashMap<String, File>(); | |
DataOutputStream ds; | |
public HttpPostUtil(String url) throws Exception { | |
this.url = new URL(url); | |
} | |
//重新设置要请求的服务器地址,即上传文件的地址。 | |
public void setUrl(String url) throws Exception { | |
this.url = new URL(url); | |
} | |
//增加一个普通字符串数据到form表单数据中 | |
public void addTextParameter(String name, String value) { | |
textParams.put(name, value); | |
} | |
//增加一个文件到form表单数据中 | |
public void addFileParameter(String name, File value) { | |
fileparams.put(name, value); | |
} | |
// 清空所有已添加的form表单数据 | |
public void clearAllParameters() { | |
textParams.clear(); | |
fileparams.clear(); | |
} | |
// 发送数据到服务器,返回一个字节包含服务器的返回结果的数组 | |
public byte[] send() throws Exception { | |
initConnection(); | |
try { | |
conn.connect(); | |
} catch (SocketTimeoutException e) { | |
// something | |
throw new RuntimeException(); | |
} | |
ds = new DataOutputStream(conn.getOutputStream()); | |
writeFileParams(); | |
writeStringParams(); | |
paramsEnd(); | |
InputStream in = conn.getInputStream(); | |
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |
int b; | |
while ((b = in.read()) != -1) { | |
out.write(b); | |
} | |
conn.disconnect(); | |
return out.toByteArray(); | |
} | |
//文件上传的connection的一些必须设置 | |
private void initConnection() throws Exception { | |
conn = (HttpURLConnection) this.url.openConnection(); | |
conn.setDoOutput(true); | |
conn.setUseCaches(false); | |
conn.setConnectTimeout(10000); //连接超时为10秒 | |
conn.setRequestMethod("POST"); | |
conn.setRequestProperty("Content-Type", | |
"multipart/form-data; boundary=" + boundary); | |
} | |
//普通字符串数据 | |
private void writeStringParams() throws Exception { | |
Set<String> keySet = textParams.keySet(); | |
for (Iterator<String> it = keySet.iterator(); it.hasNext();) { | |
String name = it.next(); | |
String value = textParams.get(name); | |
ds.writeBytes("--" + boundary + "\r\n"); | |
ds.writeBytes("Content-Disposition: form-data; name=\"" + name | |
+ "\"\r\n"); | |
ds.writeBytes("\r\n"); | |
ds.writeBytes(encode(value) + "\r\n"); | |
} | |
} | |
//文件数据 | |
private void writeFileParams() throws Exception { | |
Set<String> keySet = fileparams.keySet(); | |
for (Iterator<String> it = keySet.iterator(); it.hasNext();) { | |
String name = it.next(); | |
File value = fileparams.get(name); | |
ds.writeBytes("--" + boundary + "\r\n"); | |
ds.writeBytes("Content-Disposition: form-data; name=\"" + name | |
+ "\"; filename=\"" + encode(value.getName()) + "\"\r\n"); | |
ds.writeBytes("Content-Type: " + getContentType(value) + "\r\n"); | |
ds.writeBytes("\r\n"); | |
ds.write(getBytes(value)); | |
ds.writeBytes("\r\n"); | |
} | |
} | |
//获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream | |
private String getContentType(File f) throws Exception { | |
// return "application/octet-stream"; // 此行不再细分是否为图片,全部作为application/octet-stream 类型 | |
ImageInputStream imagein = ImageIO.createImageInputStream(f); | |
if (imagein == null) { | |
return "application/octet-stream"; | |
} | |
Iterator<ImageReader> it = ImageIO.getImageReaders(imagein); | |
if (!it.hasNext()) { | |
imagein.close(); | |
return "application/octet-stream"; | |
} | |
imagein.close(); | |
return "image/" + it.next().getFormatName().toLowerCase();//将FormatName返回的值转换成小写,默认为大写 | |
} | |
//把文件转换成字节数组 | |
private byte[] getBytes(File f) throws Exception { | |
FileInputStream in = new FileInputStream(f); | |
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |
byte[] b = new byte[1024]; | |
int n; | |
while ((n = in.read(b)) != -1) { | |
out.write(b, 0, n); | |
} | |
in.close(); | |
return out.toByteArray(); | |
} | |
//添加结尾数据 | |
private void paramsEnd() throws Exception { | |
ds.writeBytes("--" + boundary + "--" + "\r\n"); | |
ds.writeBytes("\r\n"); | |
} | |
// 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码 | |
private String encode(String value) throws Exception{ | |
return URLEncoder.encode(value, "UTF-8"); | |
} | |
public static void main(String[] args) throws Exception { | |
HttpPostUtil u = new HttpPostUtil("http://localhost:3000/up_load"); | |
u.addFileParameter("img", new File( | |
"D:\\素材\\圆月.jpg")); | |
u.addTextParameter("text", "中文"); | |
byte[] b = u.send(); | |
String result = new String(b); | |
System.out.println(result); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment