zoukankan      html  css  js  c++  java
  • android 上传文件

      android对于上传文件,还是非常easy的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!另一个特别重要的就是须要一些content-type这些參数的配置!  假设这些都弄好了,上传就非常easy了!   以下是我写的一个上传的工具类:

    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;

    /**
     * 
     * 
    上传工具类
     
    * Activity 上传的界面
     * 
    @author Harry
     * Email:huang8263901@qq.com
     * QQ:545614498
     * 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
    上传文件到server
         * 
    @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 = " "; 
            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
    里面的值为server端须要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,只是须要注意的是   ,由于须要用到了网络请求,所以大家可不要忘记在上传的时候,给androidclient加一个訪问王珞丹呃权限哦!   

     另一点就是须要大家注意一下:本人是做server端javaEE的,我发如今上传的过程中,假设文件的标识namejavakeyword之类的,上传过程中,会存在非常多位置的问题的!所以大家经可能的不要使用keyword哦!

    以下是Activity的代码:

    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 Harry
     * Email:huang8263901@qq.com
     * QQ:545614498
     * 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, 
    nullnull,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 上传图片的所有代码,假设想上传其它文件的话,能够改动过滤条件就能够了,同一时候文件的类型一定要和server端的文件类型保持一致,否则上传就失败了!

    假设大家还有在使用过程中,发现有什么问题能够联系我!

    学习在于积累!

     

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4245786.html
Copyright © 2011-2022 走看看