android上传文件到服务器

来源:互联网 发布:22级研究所升级数据 编辑:程序博客网 时间:2024/06/03 23:28

转载自:http://greatverve.cnblogs.com/archive/2011/12/23/android-upload.html

本文只包含android端,不包含服务器端

上传工具类:

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客户端加一个访问网络的权限哦!

下面是Activity的代码:

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代码:

<?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:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="选择图片"    android:id="@+id/selectImage"    />    <Button      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="上传图片"    android:id="@+id/uploadImage"    />     <ImageView      android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:id="@+id/imageView"    /></LinearLayout>

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

原创粉丝点击