上一篇
安卓上传图片到服务器案例
- 行业动态
- 2025-04-24
- 3252
安卓上传图片至服务器流程:选图→压缩转码→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
中获取图片路径:
@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();
上传图片到服务器
使用 OkHttp
或 Retrofit
上传:
// 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:上传后图片显示为空白或损坏怎么办?
解答:
- 检查客户端是否以正确的格式(如
JPEG
)压缩图片。 - 确认服务器保存路径是否存在且可写。
- 验证网络传输是否完整(如检查响应头中的
Content-Length
)。