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 }
View Code

相关文章: