当前位置:首页 > 行业动态 > 正文

安卓上传图片到服务器案例

安卓上传图片至服务器流程:选图→压缩转码→Multipart实体→Retrofit/OkHttp异步上传

安卓客户端实现

权限配置

AndroidManifest.xml 中添加存储和网络权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

动态申请存储权限(Android 6.0+)

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}

选择图片

通过相册或相机获取图片:

// 打开相册
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
// 打开相机
Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePhotoIntent, REQUEST_CODE_TAKE_PHOTO);

处理选中的图片

onActivityResult 中获取图片路径:

安卓上传图片到服务器案例  第1张

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Uri imageUri = data.getData(); // 相册返回的Uri
        // 或通过相机保存的临时文件路径
        String imagePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/temp.jpg";
        // 后续统一处理逻辑
    }
}

压缩图片(可选)

使用 Bitmap 压缩图片:

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); // 80%质量压缩
byte[] imageBytes = baos.toByteArray();

上传图片到服务器

使用 OkHttpRetrofit 上传:

// OkHttp 示例
OkHttpClient client = new OkHttpClient();
RequestBody body = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", "image.jpg", new ByteStringBody(imageBytes))
    .build();
Request request = new Request.Builder()
    .url("https://yourserver.com/upload")
    .post(body)
    .build();
client.newCall(request).enqueue(new Callback() {
    @Override public void onFailure(Call call, IOException e) { / 失败处理 / }
    @Override public void onResponse(Call call, Response response) throws IOException { / 成功处理 / }
});

服务器端接收图片(以 Spring Boot 为例)

配置文件上传大小限制

application.properties 中设置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

接收图片的控制器

@RestController
@RequestMapping("/upload")
public class UploadController {
    @PostMapping
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        try {
            String path = "/upload/" + file.getOriginalFilename();
            file.transferTo(new File(path)); // 保存到服务器本地
            return "上传成功: " + path;
        } catch (IOException e) {
            return "上传失败";
        }
    }
}

关键问题与解决方案

问题 解决方案
权限被拒绝 确保在 AndroidManifest 中声明权限,并在运行时动态申请(Android 6.0+)。
图片过大导致上传失败 使用 Bitmap 压缩图片,或限制服务器允许的文件大小。
服务器无法接收文件 检查 Spring Boot 的 multipart 配置,确保路径可写。
跨域问题 在服务器端配置 CORS(如 Spring Boot 的 @CrossOrigin 注解)。

相关问题与解答

问题1:如何测试服务器接口是否正常?

解答
可以使用 Postman 或 curl 命令模拟上传:

curl -X POST -F "file=@/path/to/image.jpg" https://yourserver.com/upload

问题2:上传后图片显示为空白或损坏怎么办?

解答

  1. 检查客户端是否以正确的格式(如 JPEG)压缩图片。
  2. 确认服务器保存路径是否存在且可写。
  3. 验证网络传输是否完整(如检查响应头中的 Content-Length)。
0