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

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_6944fc1d1fd354914ed5809f7....";
// 设置带超时配置的 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 restTemplate = getRestTemplateWithTimeout();
// 构建请求头
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()); // 上传文件
// 相册 ID,该参数非必需,没有创建相册可自己修改代码删除
// body.add("album_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)