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_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)