Android 上傳圖片到服務器

jopen 11年前發布 | 262K 次閱讀 Android Android開發 移動開發

界面很簡單,點擊 【選擇圖片】,從圖庫里選擇圖片,顯示到下面的imageview里,點擊上傳,就會上傳到指定的服務器

Android 上傳圖片到服務器

 

 

布局文件:

 

    <?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>  
Upload Activity:
public class Upload extends Activity implements OnClickListener {
    private static String requestURL = "

private String picPath = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.upload);

    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:
        if (picPath == null) {

            Toast.makeText(Upload.this, "請選擇圖片!", 1000).show();
        } else {
            final 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();
}

}</pre>

這個才是重點 UploadUtil:

public class UploadUtil {
    private static final String TAG = "uploadFile";
    private static final int TIME_OUT = 10 * 1000; // 超時時間
    private static final String CHARSET = "utf-8"; // 設置編碼
    /**

 * 上傳文件到服務器
 * @param file 需要上傳的文件
 * @param RequestURL 請求的rul
 * @return 返回響應的內容
 */
public static int uploadFile(File file, String RequestURL) {
    int res=0;
    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是文件的名字,包含后綴名
             */

            sb.append("Content-Disposition: form-data; name=\"file\"; 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=成功 當響應成功,獲取響應的流
             */
             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 res;
}

}</pre>來自:http://blog.csdn.net/onlyonecoder/article/details/8687395

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!