Android上传文件到服务器

 

 

分类: android 网络编程 android

Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易造成数据丢失,因此在这里选择了Web进行上传,使用Web进行上传是模拟的Http Post上传数据,当然,Post上传数据的类,在网上找了一找,方式虽然很多,但是没有一个感觉是我所使用的,所以参照原理之类的,进行了一下修改,算是做了一个参考。并且利用这个类完成了文件和表彰的上传服务。

上传方法一:

 

 

[java] view plaincopy
 
  1. public void uploadFile(){  
  2.          String name=URLEncoder.encode(text1.getText().toString(),"utf-8");    
  3.          String pass=URLEncoder.encode(text2.getText().toString(),"utf-8");   
  4.          Map<String, String> params = new HashMap<String, String>();         
  5.          params.put("NAME", name);     
  6.          params.put("PASSWORD", pass);  
  7.            
  8.         post("http://192.168.1.120/dev/index.php/Device/UploadFile?filename=111&filetype=IMAGE", params, upfiles);  
  9.     }  
  10.       
  11.     Map<String, File> upfiles = new HashMap<String, File>();     
  12.       
  13.     void getFile() {           
  14.         File file = new File("/sdcard/");      
  15.         File[] files = file.listFiles(new fileFilter());       
  16.           
  17.         for (File f: files) {         
  18.              upfiles.put(f.getName(), new File("/sdcard/"+f.getName()));  
  19.                  
  20.         }            
  21.          //  Toast.makeText(this, filename, Toast.LENGTH_LONG).show();     
  22.               
  23.         }       
  24.       
  25.     class fileFilter implements FilenameFilter {      
  26.         @Override            
  27.         public boolean accept(File dir, String filename) {     
  28.             return filename.endsWith(".mp3");      
  29.          }       
  30.      }    
  31.       
  32.      // 上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定    
  33.     public static boolean post(String actionUrl,Map<String, String> params,Map<String, File> files) throws IOException {    
  34.           
  35.         String BOUNDARY = java.util.UUID.randomUUID().toString();    
  36.         String PREFIX = "--", LINEND = "\r\n";    
  37.         String MULTIPART_FROM_DATA = "multipart/form-data";    
  38.         String CHARSET = "UTF-8";    
  39.         URL uri = new URL(actionUrl);    
  40.         HttpURLConnection conn = (HttpURLConnection) uri.openConnection();    
  41.         conn.setReadTimeout(5 * 1000);    
  42.         conn.setDoInput(true);// 允许输入    
  43.         conn.setDoOutput(true);// 允许输出    
  44.         conn.setUseCaches(false);    
  45.         conn.setRequestMethod("POST"); // Post方式    
  46.         conn.setRequestProperty("connection", "keep-alive");    
  47.         conn.setRequestProperty("Charsert", "UTF-8");    
  48.         conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA    
  49.                 + ";boundary=" + BOUNDARY);    
  50.         // 首先组拼文本类型的参数    
  51.         StringBuilder sb = new StringBuilder();    
  52.         for (Map.Entry<String, String> entry : params.entrySet()) {    
  53.             sb.append(PREFIX);    
  54.             sb.append(BOUNDARY);    
  55.             sb.append(LINEND);    
  56.             sb.append("Content-Disposition: form-data; name=\""    
  57.                     + entry.getKey() + "\"" + LINEND);    
  58.             sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);    
  59.             sb.append("Content-Transfer-Encoding: 8bit" + LINEND);    
  60.             sb.append(LINEND);    
  61.             sb.append(entry.getValue());    
  62.             sb.append(LINEND);    
  63.         }    
  64.         DataOutputStream outStream = new DataOutputStream(    
  65.                 conn.getOutputStream());    
  66.         outStream.write(sb.toString().getBytes());    
  67.         // 发送文件数据    
  68.         if (files != null)    
  69.             for (Map.Entry<String, File> file : files.entrySet()) {    
  70.                 StringBuilder sb1 = new StringBuilder();    
  71.                 sb1.append(PREFIX);    
  72.                 sb1.append(BOUNDARY);    
  73.                 sb1.append(LINEND);    
  74.                 sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""    
  75.                         + file.getKey() + "\"" + LINEND);    
  76.                 sb1.append("Content-Type: multipart/form-data; charset="    
  77.                         + CHARSET + LINEND);    
  78.                 sb1.append(LINEND);    
  79.                 outStream.write(sb1.toString().getBytes());    
  80.                 InputStream is = new FileInputStream(file.getValue());    
  81.                 byte[] buffer = new byte[1024];    
  82.                 int len = 0;    
  83.                 while ((len = is.read(buffer)) != -1) {    
  84.                     outStream.write(buffer, 0, len);    
  85.                 }    
  86.                 is.close();    
  87.                 outStream.write(LINEND.getBytes());    
  88.             }    
  89.         // 请求结束标志    
  90.         byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();    
  91.         outStream.write(end_data);    
  92.         outStream.flush();    
  93.         // 得到响应码    
  94.         boolean success = conn.getResponseCode()==200;    
  95.         InputStream in = conn.getInputStream();    
  96.         InputStreamReader isReader = new InputStreamReader(in);    
  97.         BufferedReader bufReader = new BufferedReader(isReader);    
  98.         String line = null;    
  99.         String data = "getResult=";    
  100.         while ((line = bufReader.readLine()) != null)    
  101.             data += line;    
  102.           
  103.         outStream.close();    
  104.         conn.disconnect();    
  105.         return success;    
  106.     }    

上传方法二;

 

 

[java] view plaincopy
 
  1. final String ENCORDING="UTF-8";  
  2.     public boolean upload(String filepath) throws Exception {  
  3.         String boundary = "---------------------------7db1c523809b2";//+java.util.UUID.randomUUID().toString();//  
  4.         // 分割线  
  5.         File file = new File(filepath);  
  6.           
  7.         String fileName=new String("哈哈嗨".getBytes(),"ISO-8859-1");  
  8.         // 用来解析主机名和端口  
  9.         URL url = new URL("http://192.168.1.120/dev/index.php/Device/UploadFile?filename="+fileName+"&filetype=IMAGE");  
  10.         // 用来开启连接   
  11.         StringBuilder sb = new StringBuilder();  
  12.         // 用来拼装请求  
  13.   
  14.         /*// username字段 
  15.         sb.append("--" + boundary + "\r\n"); 
  16.         sb.append("Content-Disposition: form-data; name=\"username\"" + "\r\n"); 
  17.         sb.append("\r\n"); 
  18.         sb.append(username + "\r\n"); 
  19.  
  20.         // password字段 
  21.         sb.append("--" + boundary + "\r\n"); 
  22.         sb.append("Content-Disposition: form-data; name=\"password\"" + "\r\n"); 
  23.         sb.append("\r\n"); 
  24.         sb.append(password + "\r\n");*/  
  25.           
  26.         // 文件部分  
  27.         sb.append("--" + boundary + "\r\n");  
  28.         sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + filepath + "\"" + "\r\n");  
  29.         sb.append("Content-Type: application/octet-stream" + "\r\n");  
  30.         sb.append("\r\n");  
  31.   
  32.         // 将开头和结尾部分转为字节数组,因为设置Content-Type时长度是字节长度  
  33.         byte[] before = sb.toString().getBytes(ENCORDING);  
  34.         byte[] after = ("\r\n--" + boundary + "--\r\n").getBytes(ENCORDING);  
  35.   
  36.         // 打开连接, 设置请求头  
  37.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  38.         conn.setConnectTimeout(10000);  
  39.         conn.setRequestMethod("POST");  
  40.         conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);  
  41.         conn.setRequestProperty("Content-Length", before.length + file.length() + after.length + "");  
  42.       
  43.         conn.setDoOutput(true);  
  44.         conn.setDoInput(true);  
  45.   
  46.         // 获取输入输出流  
  47.         OutputStream out = conn.getOutputStream();  
  48.         FileInputStream fis = new FileInputStream(file);  
  49.         // 将开头部分写出  
  50.         out.write(before);  
  51.   
  52.         // 写出文件数据  
  53.         byte[] buf = new byte[1024*5];  
  54.         int len;  
  55.         while ((len = fis.read(buf)) != -1)  
  56.         out.write(buf, 0, len);  
  57.   
  58.         // 将结尾部分写出  
  59.         out.write(after);  
  60.           
  61.          InputStream in = conn.getInputStream();    
  62.          InputStreamReader isReader = new InputStreamReader(in);    
  63.          BufferedReader bufReader = new BufferedReader(isReader);    
  64.             String line = null;    
  65.             String data = "getResult=";    
  66.             while ((line = bufReader.readLine()) != null)    
  67.                 data += line;       
  68.             Log.e("fromServer", "result="+data);  
  69.             boolean sucess=conn.getResponseCode() == 200;  
  70.             in.close();  
  71.             fis.close();  
  72.             out.close();  
  73.             conn.disconnect();  
  74.               
  75.             return sucess;    
  76.         }  
  77.       

 

 

通过此代码就可以实现将内容保存到SD卡等设备上,当然要使用网络,必须得有网络的访问权限。这个需要自己添加,在这里不再添加!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。