首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android圖片上傳服務器:原理、流程與代碼實現全解析

     編輯:程式設計綜合問答

很多初學者以為上傳圖片是傳「本地路徑」,實則完全錯誤。本文徹底講清Android圖片上傳的核心機制與標準實現。

核心概念:上傳的是二進制流,而非路徑

  • 路徑僅是本地文件系統索引,服務器無法訪問客戶端文件系統。
  • 上傳本質:客戶端讀取文件 → 輸出流寫入HTTP請求體 → 服務器輸入流讀取請求體 → 保存為文件/存入數據庫/上傳雲存儲。

標準上傳流程

  1. 選擇圖片:`Intent.ACTION_PICK`或`ACTION_GET_CONTENT`獲取`Uri`。
  2. 獲取輸入流:`context.contentResolver.openInputStream(uri)`(支持Content Provider、文件、媒體庫統一訪問)。
  3. 壓縮/轉碼(可選):`BitmapFactory.decodeStream` → `compress` → `ByteArrayOutputStream`,或直接流式傳輸大文件。
  4. 構建Multipart請求:使用OkHttp/Retrofit構建`MultipartBody.Part`。
  5. 發起上傳:異步執行,監聽進度/結果。

關鍵代碼片段

// 1. 選圖
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE);

// 2. onActivityResult獲取Uri
Uri selectedImage = data.getData();

// 3. 上傳
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), getFileFromUri(uri));
MultipartBody.Part part = MultipartBody.Part.createFormData("file", getFileName(uri), requestFile);
RequestBody desc = RequestBody.create(MediaType.parse("text/plain"), "avatar");

apiService.uploadAvatar(part, desc).enqueue(new Callback() {
    @Override public void onResponse(Call call, Response response) { /* 成功 */ }
    @Override public void onFailure(Call call, Throwable t) { /* 失敗 */ }
});

// 輔助:Uri轉File(僅用於獲取文件名/大小,實際上傳用流)
private File getFileFromUri(Uri uri) { /* 使用ContentResolver查詢_DISPLAY_NAME,_SIZE,開輸入流寫入臨時文件或直接用流 */ }

進階優化

  • 大文件分片上傳/斷點續傳:分片計算MD5、秒傳、續傳。
  • 圖片壓縮策略:質量壓縮、尺寸壓縮、WebP格式、原圖+縮圖雙上傳。
  • 安全性:簽名驗證、防盜鏈、內容審核、病毒掃描。
  • 雲存儲直傳:客戶端獲取STS臨時憑證 → 直傳OSS/S3/COS,減輕應用服務器壓力。
記住:客戶端只有輸出流,服務器只有輸入流,中間靠HTTP協議傳輸二進制數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved