android 文件上传到服务器

Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简单了,下面是我写的一个上传的工具类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package  com.spring.sky.image.upload.network;
 
import  java.io.DataOutputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
import  java.util.UUID;
import  android.util.Log;
 
/**
  *
  * 上传工具类
  *
  * @author spring sky Email:vipa1888@163.com QQ:840950105 MyName:石明政
  */
public  class  UploadUtil {
     private  static  final  String TAG =  "uploadFile" ;
     private  static  final  int  TIME_OUT =  10  1000 // 超时时间
     private  static  final  String CHARSET =  "utf-8" // 设置编码
 
     /**
      * Android上传文具到服务端
      *
      * @param file
      *            需要上传的文件
      * @param RequestURL
      *            请求的rul
      * @return 返回响应的内容
      */
     public  static  String uploadFile(File file, String RequestURL) {
         String result =  null ;
         String BOUNDARY = UUID.randomUUID().toString();  // 边界标识 随机生成
         String PREFIX =  "--" , LINE_END =  "\r\n" ;
         String CONTENT_TYPE =  "multipart/form-data" // 内容类型
 
         try  {
             URL url =  new  URL(RequestURL);
             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
             conn.setReadTimeout(TIME_OUT);
             conn.setConnectTimeout(TIME_OUT);
             conn.setDoInput( true );  // 允许输入流
             conn.setDoOutput( true );  // 允许输出流
             conn.setUseCaches( false );  // 不允许使用缓存
             conn.setRequestMethod( "POST" );  // 请求方式
             conn.setRequestProperty( "Charset" , CHARSET);  // 设置编码
             conn.setRequestProperty( "connection" "keep-alive" );
             conn.setRequestProperty( "Content-Type" , CONTENT_TYPE + ";boundary="
                     + BOUNDARY);
 
             if  (file !=  null ) {
                 /**
                  * 当文件不为空,把文件包装并且上传
                  */
                 DataOutputStream dos =  new  DataOutputStream(
                         conn.getOutputStream());
                 StringBuffer sb =  new  StringBuffer();
                 sb.append(PREFIX);
                 sb.append(BOUNDARY);
                 sb.append(LINE_END);
                 /**
                  * 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
                  * filename是文件的名字,包含后缀名的 比如:abc.png
                  */
 
                 sb.append( "Content-Disposition: form-data; name=\"img\"; filename=\""
                         + file.getName() +  "\""  + LINE_END);
                 sb.append( "Content-Type: application/octet-stream; charset="
                         + CHARSET + LINE_END);
                 sb.append(LINE_END);
                 dos.write(sb.toString().getBytes());
                 InputStream is =  new  FileInputStream(file);
                 byte [] bytes =  new  byte [ 1024 ];
                 int  len =  0 ;
                 while  ((len = is.read(bytes)) != - 1 ) {
                     dos.write(bytes,  0 , len);
                 }
                 is.close();
                 dos.write(LINE_END.getBytes());
                 byte [] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)
                         .getBytes();
                 dos.write(end_data);
                 dos.flush();
                 /**
                  * 获取响应码 200=成功 当响应成功,获取响应的流
                  */
                 int  res = conn.getResponseCode();
                 Log.e(TAG,  "response code:"  + res);
                 // if(res==200)
                 // {
                 Log.e(TAG,  "request success" );
                 InputStream input = conn.getInputStream();
                 StringBuffer sb1 =  new  StringBuffer();
                 int  ss;
                 while  ((ss = input.read()) != - 1 ) {
                     sb1.append(( char ) ss);
                 }
                 result = sb1.toString();
                 Log.e(TAG,  "result : "  + result);
                 // }
                 // else{
                 // Log.e(TAG, "request error");
                 // }
             }
         catch  (MalformedURLException e) {
             e.printStackTrace();
         catch  (IOException e) {
             e.printStackTrace();
         }
         return  result;
     }
}

参数就一个File文件和一个请求上传的URL,不过需要注意的是,因为用到了网络请求,所以大家不要忘记在上传的时候,给android客户端加一个访问网络的权限哦!

还有一点就是需要大家注意一下:本人是做服务器端javaEE的,我发现在上传的过程中,如果文件的标识name是java关键字之类的,上传过程中,会存在很多位置的问题的!所以大家经可能的不要使用关键字哦!

下面是Activity的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package  com.spring.sky.image.upload;
 
import  java.io.File;
import  com.spring.sky.image.upload.network.UploadUtil;
import  android.app.Activity;
import  android.app.AlertDialog;
import  android.app.Dialog;
import  android.content.ContentResolver;
import  android.content.DialogInterface;
import  android.content.Intent;
import  android.database.Cursor;
import  android.graphics.Bitmap;
import  android.graphics.BitmapFactory;
import  android.net.Uri;
import  android.os.Bundle;
import  android.provider.MediaStore;
import  android.util.Log;
import  android.view.View;
import  android.view.View.OnClickListener;
import  android.widget.Button;
import  android.widget.ImageView;
 
/**
  * Activity 上传的界面
  *
  * @author spring sky Email:vipa1888@163.com QQ:840950105 MyName:石明政
  *
  */
public  class  MainActivity  extends  Activity  implements  OnClickListener {
     private  static  final  String TAG =  "uploadImage" ;
     private  static  String requestURL = "http://192.168.1.14:8080/SetBlobData/img!up" ;
     private  Button selectImage, uploadImage;
     private  ImageView imageView;
 
     private  String picPath =  null ;
 
     /** Called when the activity is first created. */
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
 
         selectImage = (Button)  this .findViewById(R.id.selectImage);
         uploadImage = (Button)  this .findViewById(R.id.uploadImage);
         selectImage.setOnClickListener( this );
         uploadImage.setOnClickListener( this );
 
         imageView = (ImageView)  this .findViewById(R.id.imageView);
 
     }
 
     @Override
     public  void  onClick(View v) {
         switch  (v.getId()) {
         case  R.id.selectImage:
             /***
              * 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的
              */
             Intent intent =  new  Intent();
             intent.setType( "image/*" );
             intent.setAction(Intent.ACTION_GET_CONTENT);
             startActivityForResult(intent,  1 );
             break ;
         case  R.id.uploadImage:
             File file =  new  File(picPath);
             if  (file !=  null ) {
                 String request = UploadUtil.uploadFile(file, requestURL);
                 uploadImage.setText(request);
             }
             break ;
         default :
             break ;
         }
     }
 
     @Override
     protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
         if  (resultCode == Activity.RESULT_OK) {
             /**
              * 当选择的图片不为空的话,在获取到图片的途径
              */
             Uri uri = data.getData();
             Log.e(TAG,  "uri = "  + uri);
             try  {
                 String[] pojo = { MediaStore.Images.Media.DATA };
 
                 Cursor cursor = managedQuery(uri, pojo,  null null null );
                 if  (cursor !=  null ) {
                     ContentResolver cr =  this .getContentResolver();
                     int  colunm_index = cursor
                             .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                     cursor.moveToFirst();
                     String path = cursor.getString(colunm_index);
                     /***
                      * 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,
                      * 这样的话,我们判断文件的后缀名 如果是图片格式的话,那么才可以
                      */
                     if  (path.endsWith( "jpg" ) || path.endsWith( "png" )) {
                         picPath = path;
                         Bitmap bitmap = BitmapFactory.decodeStream(cr
                                 .openInputStream(uri));
                         imageView.setImageBitmap(bitmap);
                     else  {
                         alert();
                     }
                 else  {
                     alert();
                 }
 
             catch  (Exception e) {
             }
         }
 
         super .onActivityResult(requestCode, resultCode, data);
     }
 
     private  void  alert() {
         Dialog dialog =  new  AlertDialog.Builder( this ).setTitle( "提示" )
                 .setMessage( "您选择的不是有效的图片" )
                 .setPositiveButton( "确定" new  DialogInterface.OnClickListener() {
                     public  void  onClick(DialogInterface dialog,  int  which) {
                         picPath =  null ;
                     }
                 }).create();
         dialog.show();
     }
 
}

layout代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<? xml  version = "1.0"  encoding = "utf-8" ?>
< LinearLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:orientation = "vertical"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent" >
     < Button
         android:id = "@+id/selectImage"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "选择图片"
         />
     < Button
         android:id = "@+id/uploadImage"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "上传图片"
         />
     < ImageView
         android:id = "@+id/imageView"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         />
</ LinearLayout >

以上就是android上传图片的全部代码,如果想上传其他文件的话,可以修改过滤条件就可以了,同时文件的类型一定要和服务器端的文件类型保持一致,否则上传就失败了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值