上一篇
android上传图片到.net服务器上
- 行业动态
- 2025-05-03
- 4986
Android端使用MultipartEntity封装图片文件,通过HttpURLConnection或OkHttp发送POST请求;.NET服务器端通过HttpContext.Request.Files获取文件流,保存至指定路径,注意设置接收文件大小限制及MIME类型
Android上传图片到.NET服务器实现方案
Android端实现
权限配置
在AndroidManifest.xml
中添加存储和网络权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/>
图片选择与处理
通过Intent
选择图片,并转换为Bitmap
或File
:// 调用系统相册选择图片 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE);
图片压缩与格式转换
- 压缩图片(可选):
Bitmap bitmap = BitmapFactory.decodeStream(inputStream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); // 压缩为JPEG,质量80% byte[] imageBytes = baos.toByteArray();
- 转换为Base64(适用于小文件):
String base64Image = Base64.encodeToString(imageBytes, Base64.DEFAULT);
- 压缩图片(可选):
网络请求上传
使用OkHttp
或Retrofit
发送POST请求:- 方式1:Base64上传
// 构建JSON请求体 JSONObject json = new JSONObject(); json.put("image", base64Image); RequestBody body = RequestBody.create(json.toString(), MediaType.get("application/json"));
- 方式2:Multipart上传(推荐大文件)
// 构建Multipart请求体 MultipartBody.Builder builder = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image", "file.jpg", RequestBody.create(imageBytes, MediaType.parse("image/jpeg"))); RequestBody requestBody = builder.build();
- 方式1:Base64上传
完整上传代码示例(OkHttp)
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://yourserver.com/api/upload") // 替换为.NET服务器地址 .post(requestBody) .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 { if (response.isSuccessful()) { // 处理成功 } else { // 处理错误 } } });
.NET服务器端实现
接收图片接口
使用ASP.NET Core创建API接口:[HttpPost("api/upload")] public IActionResult UploadImage([FromForm] IFormFile file) { if (file == null || file.Length == 0) return BadRequest(); string path = Path.Combine(Directory.GetCurrentDirectory(), "uploads", file.FileName); using (var stream = new FileStream(path, FileMode.Create)) { file.CopyTo(stream); } return Ok(new { path }); }
配置允许跨域
在Startup.cs
中添加CORS配置:public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("AllowAll", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseCors("AllowAll"); app.UseRouting().UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
关键步骤对比表
步骤 | Android端实现 | .NET端实现 | 注意事项 |
---|---|---|---|
图片选择 | Intent.ACTION_PICK | 无需处理 | 需动态申请存储权限 |
图片压缩 | Bitmap.compress | 无需处理 | 控制文件大小,避免OOM |
格式转换 | Base64或Multipart | 接收IFormFile | Base64适合小文件,Multipart适合大文件 |
网络请求 | OkHttp/Retrofit | ASP.NET Core API | 处理超时、重试机制 |
文件存储 | 无需处理(客户端) | FileStream 保存到服务器路径 | 检查文件类型,防止安全风险 |
相关问题与解答
问题1:如何限制上传图片的大小和格式?
- 解答:
- Android端:在压缩图片时检查
Bitmap
尺寸,或通过File
对象判断文件大小。 - .NET端:在接口中校验
file.ContentType
(如image/jpeg
)和file.Length
(如限制为5MB)。if (file.ContentType != "image/jpeg" || file.Length > 5 1024 1024) { return BadRequest("仅支持JPEG格式,且大小不超过5MB"); }
- Android端:在压缩图片时检查
问题2:如何显示上传进度?
- 解答:
- Android端:使用
OkHttp
的ProgressResponseBody
或Retrofit
的ProgressListener
监听上传进度。 - .NET端:无需处理,但可记录日志或返回当前处理状态。
// OkHttp进度示例 client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { // 更新UI(需切换到主线程) } });
- Android端:使用