android 端代码
1 package com.example.uploadfile; 2 3 import java.io.DataOutputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.HttpURLConnection; 9 import java.net.MalformedURLException; 10 import java.net.URL; 11 import java.util.Map; 12 13 public class PostFile { 14 static String BOUNDARY = java.util.UUID.randomUUID().toString(); 15 static String PREFIX = "--"; 16 static String LINEND = "\r\n"; 17 static String MULTIPART_FROM_DATA = "multipart/form-data"; 18 static String CHARSET = "UTF-8"; 19 static String result =null; 20 static int SO_TIMEOUT=5*1000; 21 22 //上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定 23 public static String post(String actionUrl, Map<String, String> params, 24 Map<String, File> files) throws IOException { 25 try{ 26 URL url =new URL(actionUrl); 27 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 28 conn.setReadTimeout(SO_TIMEOUT); 29 conn.setConnectTimeout(SO_TIMEOUT); 30 conn.setDoInput(true);// 允许输入流 31 conn.setDoOutput(true);// 允许输出流 32 conn.setUseCaches(false);// 不允许使用缓存 33 conn.setRequestMethod("POST");// 请求方式 34 conn.setRequestProperty("Charset",CHARSET);// 设置编码 35 conn.setRequestProperty("connection","keep-alive"); 36 conn.setRequestProperty("Charsert", CHARSET); 37 conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA +";boundary="+ BOUNDARY); 38 /** 39 * 当文件不为空,把文件包装并且上传 40 */ 41 DataOutputStream dos =new DataOutputStream( 42 conn.getOutputStream()); 43 StringBuffer sb =new StringBuffer(); 44 for(Map.Entry<String, String> entry : params.entrySet()) { 45 sb.append(PREFIX); 46 sb.append(BOUNDARY); 47 sb.append(LINEND); 48 sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() +"\""+ LINEND); 49 sb.append("Content-Type: application/octet-stream; charset="+CHARSET+ LINEND); 50 sb.append(LINEND); 51 sb.append(entry.getValue()); 52 sb.append(LINEND); 53 } 54 if(files!=null){ 55 for (Map.Entry<String, File> file : files.entrySet()) { 56 sb.append(PREFIX); 57 sb.append(BOUNDARY); 58 sb.append(LINEND); 59 /** 60 * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 61 * filename是文件的名字,包含后缀名的 比如:abc.png 62 */ 63 sb.append("Content-Disposition: form-data; name=\""+file.getKey()+"\"; filename=\""+ file.getValue() +"\""+ LINEND); 64 sb.append("Content-Type: application/octet-stream; charset="+CHARSET+ LINEND); 65 sb.append(LINEND); 66 67 dos.write(sb.toString().getBytes()); 68 InputStream is =new FileInputStream(file.getValue()); 69 byte[] bytes =new byte[1024]; 70 int len = 0; 71 while((len = is.read(bytes)) != -1) { 72 dos.write(bytes, 0, len); 73 } 74 is.close(); 75 dos.write(LINEND.getBytes()); 76 } 77 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); 78 dos.write(end_data); 79 dos.flush(); 80 /** 81 * 获取响应码 200=成功 当响应成功,获取响应的流 82 */ 83 int res= conn.getResponseCode(); 84 85 InputStream input = conn.getInputStream(); 86 StringBuffer sb1 =new StringBuffer(); 87 int ss; 88 while((ss = input.read()) != -1) { 89 sb1.append((char) ss); 90 } 91 result = sb1.toString(); 92 } 93 }catch(MalformedURLException e) { 94 e.printStackTrace(); 95 }catch(IOException e) { 96 e.printStackTrace(); 97 } 98 return result; 99 } 100 101 102 /** 103 * 上传单张图片加参数 104 *@paramfile 文件 105 *@paramfileName 服务器接口图片参数名称 106 *@paramRequestURL 上传URL 107 *@paramparams 参数 108 *@return 109 */ 110 public static String PostData(File file,String fileName, String RequestURL,Map<String, String> params) { 111 112 try{ 113 URL url =new URL(RequestURL); 114 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 115 conn.setReadTimeout(SO_TIMEOUT); 116 conn.setConnectTimeout(SO_TIMEOUT); 117 conn.setDoInput(true);// 允许输入流 118 conn.setDoOutput(true);// 允许输出流 119 conn.setUseCaches(false);// 不允许使用缓存 120 conn.setRequestMethod("POST");// 请求方式 121 conn.setRequestProperty("Charset",CHARSET);// 设置编码 122 conn.setRequestProperty("connection","keep-alive"); 123 conn.setRequestProperty("Charsert", CHARSET); 124 conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA +";boundary="+ BOUNDARY); 125 126 if(file !=null) { 127 /** 128 * 当文件不为空,把文件包装并且上传 129 */ 130 DataOutputStream dos =new DataOutputStream( 131 conn.getOutputStream()); 132 StringBuffer sb =new StringBuffer(); 133 134 for(Map.Entry<String, String> entry : params.entrySet()) { 135 sb.append(PREFIX); 136 sb.append(BOUNDARY); 137 sb.append(LINEND); 138 sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() +"\""+ LINEND); 139 sb.append("Content-Type: application/octet-stream; charset="+CHARSET+ LINEND); 140 sb.append(LINEND); 141 sb.append(entry.getValue()); 142 sb.append(LINEND); 143 } 144 145 sb.append(PREFIX); 146 sb.append(BOUNDARY); 147 sb.append(LINEND); 148 /** 149 * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 150 * filename是文件的名字,包含后缀名的 比如:abc.png 151 */ 152 sb.append("Content-Disposition: form-data; name=\""+fileName+"\"; filename=\""+ file.getName() +"\""+ LINEND); 153 sb.append("Content-Type: application/octet-stream; charset="+CHARSET+ LINEND); 154 sb.append(LINEND); 155 156 dos.write(sb.toString().getBytes()); 157 InputStream is =new FileInputStream(file); 158 byte[] bytes =new byte[1024]; 159 int len = 0; 160 while((len = is.read(bytes)) != -1) { 161 dos.write(bytes, 0, len); 162 } 163 is.close(); 164 dos.write(LINEND.getBytes()); 165 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND) 166 .getBytes(); 167 dos.write(end_data); 168 dos.flush(); 169 /** 170 * 获取响应码 200=成功 当响应成功,获取响应的流 171 */ 172 int res= conn.getResponseCode(); 173 174 InputStream input = conn.getInputStream(); 175 StringBuffer sb1 =new StringBuffer(); 176 int ss; 177 while((ss = input.read()) != -1) { 178 sb1.append((char) ss); 179 } 180 result = sb1.toString(); 181 } 182 }catch(MalformedURLException e) { 183 e.printStackTrace(); 184 }catch(IOException e) { 185 e.printStackTrace(); 186 } 187 return result; 188 } 189 }