返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 将图片上传到PicGo图床网站教程

作者:hangge | 2024-12-20 08:36
    PicGo 是一个免费、简单易用的图床网站,我之前写过文章介绍其如何使用以及相关的 API 方法(点击查看)。而在项目实践中,通常是通过程序来调用其 API 接口进行图片上传。本文通过样例演示如何实现 SpringBoot 项目与 PicGo 图床的整合。

1,准备工作

(1)首先我们需要在 PicGo 上注册一个账号,并获取 API Key,具体即可参考我之前写的文章:

(2)由于 PicGo 的接口返回数据格式为 JSON,因此需要在项目的 pom.xml 文件中添加 FastJSON 依赖进行数据解析。
<!-- JSON 依赖 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.68</version>
</dependency>

2,样例代码

(1)首先我们创建一个用于将图片上传至 PicGo 图床的工具类 FileUploadUtil.java,具体代码如下:
注意:代码中 API Key 根据实际情况进行修改。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map;
public class FileUploadUtil {
    // API Key 和上传地址常量
    private static final String UPLOAD_URL = "https://www.picgo.net/api/1/upload";
    private static final String API_KEY = "chv_qrlu_6944fc1d1fd354914ed5809f71f14fda8318d12b0c8fdc5955c5cce3f38700d20411b6a8c35ef4b3b754eb7f5cdd1889c7a6eebf128a7e67fe78dcd2073";

    // 设置带超时配置的 RestTemplate
    private static RestTemplate getRestTemplateWithTimeout() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(10000); // 连接超时时间,单位为毫秒
        factory.setReadTimeout(10000);    // 读取超时时间,单位为毫秒
        return new RestTemplate(factory);
    }

    // 上传文件
    public static String uploadFile(MultipartFile file, String fileName) {
        try {
            RestTemplate restTemplate = getRestTemplateWithTimeout();  // 使用带超时配置的 RestTemplate

            // 构建请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);

            // 构建请求体
            MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
            body.add("key", API_KEY);  // API Key
            body.add("source", file.getResource());  // 上传文件
            // body.add("album_id", "你自己的相册 ID");  // 相册 ID,该参数非必需,没有创建相册可自己修改代码删除
            body.add("title", fileName);  // 文件名
            body.add("format", "json");  // 响应格式

            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);

            // 发送请求并获取 JSON 响应字符串
            ResponseEntity<String> responseEntity = restTemplate.exchange(UPLOAD_URL, HttpMethod.POST, requestEntity, String.class);
            String responseJson = responseEntity.getBody();

            if (responseJson != null) {
                // 使用 FastJSON 解析 JSON
                JSONObject responseObject = JSON.parseObject(responseJson);

                // 提取返回结果中的信息
                if (responseObject.containsKey("image")) {
                    JSONObject imageInfo = responseObject.getJSONObject("image");
                    return imageInfo.getString("url"); // 返回图片的 URL
                } else if (responseObject.containsKey("error")) {
                    JSONObject errorInfo = responseObject.getJSONObject("error");
                    return "上传失败: " + errorInfo.getString("message");
                }
            }

            return "上传失败";
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败: " + e.getMessage();
        }
    }
}

(2)接着我们编写一个上传接口用于测试:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;

@RestController
public class HelloController {
    @PostMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename().trim();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String prefix = UUID.randomUUID().toString();
        String fileName = prefix + suffix;
        // 调用工具类上传文件并获取结果
        String result = FileUploadUtil.uploadFile(file, fileName);
        // 返回上传结果
        if (result.startsWith("http")) {
            return result; // 返回图片 URL
        } else {
            return "error"; // 返回失败信息
        }
    }
}

3,运行测试

(1)启动项目,我们使用 Postman 测试一下接口,可以看到图片提交后成功返回 PicGO 图床上的地址: 

(2)使用该地址可以成功打开图片,说明整个链路正常,整合成功。
评论

全部评论(0)

回到顶部