Android 文件上传至 Spring Boot 服务端的完整指南

在这一篇文章中,我们将要学习如何将文件从 Android 客户端上传到 Spring Boot 服务端。这个过程涉及多个步骤,包括设置 Android 客户端、创建 Spring Boot 服务端以及处理文件上传的逻辑。让我们首先查看整个流程的步骤,以便概览整个过程。

整体流程

步骤 描述
1 设置 Spring Boot 项目
2 在 Spring Boot 中实现文件上传接口
3 设置 Android 项目
4 实现文件选择与上传逻辑

1. 设置 Spring Boot 项目

首先,我们需要创建一个 Spring Boot 项目。你可以使用 Spring Initializr(

  • Spring Web
  • Spring Boot DevTools

生成项目后,解压并在 IDE(如 IntelliJ IDEA 或 Eclipse)中打开。

2. 在 Spring Boot 中实现文件上传接口

接下来,我们将在 Spring Boot 中创建上传文件的接口。

创建控制器类

src/main/java/com/example/demo 下创建一个控制器类 FileUploadController.java

package com.example.demo;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
@RequestMapping("/api/file")
public class FileUploadController {

    // 文件上传接口
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 保存文件的位置
            Path path = Paths.get("uploads/" + file.getOriginalFilename());
            // 将文件写入指定路径
            Files.write(path, file.getBytes());
            return "文件上传成功: " + file.getOriginalFilename();
        } catch (Exception e) {
            e.printStackTrace();
            return "文件上传失败: " + e.getMessage();
        }
    }
}

代码说明

  • @RestController: 标记该类为一个控制器,并允许我们进行 RESTful API 的构建。
  • @RequestMapping: 指定了所有请求的基本路径。
  • @PostMapping("/upload"): 这表示处理 POST 请求的 /api/file/upload 路径。
  • @RequestParam("file"): 这里我们接收上传的文件,通过 MultipartFile 类型获取。
  • Files.write(...): 将接收到的文件字节写入指定路径。

3. 设置 Android 项目

在 Android Studio 中创建一个新的项目,设置合适的 API 版本和项目名。接下来,确保你的 AndroidManifest.xml 文件包含以下权限:

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

添加依赖

build.gradle 文件中添加以下依赖项以使用相关网络库:

implementation 'com.squareup.okhttp3:okhttp:4.9.3' // OkHttp 网络请求库

4. 实现文件选择与上传逻辑

在 Android 项目中,我们需要实现选择文件和上传文件的功能。我们可以在 MainActivity.java 中编写以下代码:

选择文件

以下代码用于选择文件:

public void selectFile(View view) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*"); // 选择所有类型的文件
    startActivityForResult(intent, 1); // 1为请求码
}

处理文件选择结果

onActivityResult 方法中处理返回的文件:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
        Uri fileUri = data.getData(); // 获取文件Uri
        uploadFile(fileUri);
    }
}

上传文件

接下来,使用 OkHttp 上传文件:

private void uploadFile(Uri fileUri) {
    String url = "http://your-server-address:8080/api/file/upload"; // 你的服务器地址

    File file = new File(fileUri.getPath()); // 从Uri获取文件路径

    // 创建OkHttpClient实例
    OkHttpClient client = new OkHttpClient();
    
    // 创建RequestBody
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM) // 设置请求类型
            .addFormDataPart("file", file.getName(), RequestBody.create(file, MediaType.parse("application/octet-stream"))) // 添加文件信息
            .build();

    // 创建Request
    Request request = new Request.Builder()
            .url(url)
            .post(requestBody)
            .build();

    // 进行异步网络请求
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
            // 处理上传失败的逻辑
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                // 处理成功的逻辑
                String responseData = response.body().string();
                Log.d("UploadResponse", responseData);
            } else {
                // 处理响应失败的逻辑
            }
        }
    });
}

代码说明

  • Intent.ACTION_GET_CONTENT: 用于启动选择文件的界面。
  • Uri fileUri: 获取选择的文件的 URI。
  • OkHttpClient: 创建 OkHttp 客户端用于发起请求。
  • MultipartBody: 用于构建 multipart/form-data 请求体。
  • RequestBody.create(...): 创建文件的请求体。
  • client.newCall(request).enqueue(...): 异步提交网络请求。

类图示例

最后,我们可以使用 Mermaid 语法绘制一个类图来展示我们创建的类之间的关系:

classDiagram
class FileUploadController {
    +uploadFile(MultipartFile file)
}

结语

通过以上步骤,我们可以成功搭建一个简单的 Android 文件上传至 Spring Boot 的服务。掌握这一技术后,您将能够轻松处理文件的上传需求。希望这篇文章能够对您有所帮助,欢迎深入探索 Spring Boot 和 Android 的更多功能!如果有任何问题,请随时提出。