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

android上传图片到.net服务器上

Android端使用MultipartEntity封装图片文件,通过HttpURLConnection或OkHttp发送POST请求;.NET服务器端通过HttpContext.Request.Files获取文件流,保存至指定路径,注意设置接收文件大小限制及MIME类型

Android上传图片到.NET服务器实现方案


Android端实现

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

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
  2. 图片选择与处理
    通过Intent选择图片,并转换为BitmapFile

    // 调用系统相册选择图片
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE);
  3. 图片压缩与格式转换

    • 压缩图片(可选):
      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);
  4. 网络请求上传
    使用OkHttpRetrofit发送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();
  5. 完整上传代码示例(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服务器端实现

  1. 接收图片接口
    使用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 });
    }
  2. 配置允许跨域
    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");
      }

问题2:如何显示上传进度?

  • 解答
    • Android端:使用OkHttpProgressResponseBodyRetrofitProgressListener监听上传进度。
    • .NET端:无需处理,但可记录日志或返回当前处理状态。
      // OkHttp进度示例
      client.newCall(request).enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            // 更新UI(需切换到主线程)
        }
      });
0