本人的图床网站:http://images.qkongtao.cn/
5. 根据要求填写,还有填写相关管理员的信息,填写成功后,再次进入该网址,就直接进入了chevereto图床首页。
6. 进入之后可以登录进入仪盘表对网站进行美化。
chevereto图床API开发可以查阅文档:http://ch.cndrew.cn/cn/API/API%20V1/#api_4
里面也有chevereto的使用方法。
下面就来说说怎么把chevereto图床应用到项目中:
* 请求成功后返回
{ | |
"status_code": 200, | |
"success": { | |
"message": "image uploaded", | |
"code": 200 | |
}, | |
"image": { | |
"name": "911401", | |
"extension": "jpg", | |
"size": "606003", | |
"width": "1920", | |
"height": "1080", | |
"date": "2021-04-02 00:21:17", | |
"date_gmt": "2021-04-01 15:21:17", | |
"title": "911401", | |
"description": null, | |
"nsfw": "0", | |
"storage_mode": "datefolder", | |
"storage_id": null, | |
"md5": "4efe43e242baa28c623c1e3efdff1b39", | |
"source_md5": null, | |
"original_filename": "911401.jpg", | |
"original_exifdata": null, | |
"views": "0", | |
"category_id": null, | |
"chain": "7", | |
"thumb_size": "9318", | |
"medium_size": "33633", | |
"expiration_date_gmt": null, | |
"likes": "0", | |
"is_animated": "0", | |
"file": { | |
"resource": { | |
"type": "path", | |
"chain": { | |
"image": "/www/wwwroot/root/Chevereto-Free-master/images/2021/04/02/911401.jpg", | |
"thumb": "/www/wwwroot/root/Chevereto-Free-master/images/2021/04/02/911401.th.jpg", | |
"medium": "/www/wwwroot/root/Chevereto-Free-master/images/2021/04/02/911401.md.jpg" | |
} | |
} | |
}, | |
"id_encoded": "l41", | |
"filename": "911401.jpg", | |
"mime": "image/jpeg", | |
"url": "http://images.qkongtao.cn/images/2021/04/02/911401.jpg", | |
"url_viewer": "http://images.qkongtao.cn/image/l41", | |
"image": { | |
"filename": "911401.jpg", | |
"name": "911401", | |
"mime": "image/jpeg", | |
"extension": "jpg", | |
"url": "http://images.qkongtao.cn/images/2021/04/02/911401.jpg", | |
"size": "606003" | |
}, | |
"thumb": { | |
"filename": "911401.th.jpg", | |
"name": "911401.th", | |
"mime": "image/jpeg", | |
"extension": "jpg", | |
"url": "http://images.qkongtao.cn/images/2021/04/02/911401.th.jpg", | |
"size": "9318" | |
}, | |
"medium": { | |
"filename": "911401.md.jpg", | |
"name": "911401.md", | |
"mime": "image/jpeg", | |
"extension": "jpg", | |
"url": "http://images.qkongtao.cn/images/2021/04/02/911401.md.jpg", | |
"size": "33633" | |
}, | |
"size_formatted": "606 KB", | |
"display_url": "http://images.qkongtao.cn/images/2021/04/02/911401.md.jpg", | |
"display_width": "1920", | |
"display_height": "1080", | |
"views_label": "次浏览", | |
"likes_label": "喜欢", | |
"how_long_ago": "刚刚", | |
"date_fixed_peer": "2021-04-01 15:21:17", | |
"title_truncated": "911401", | |
"title_truncated_html": "911401", | |
"is_use_loader": false | |
}, | |
"status_txt": "OK" | |
} |
步骤是这样的:
* 先在后端配置好请求的参数和路径
* 然后再Java后端发送http请求,传入的文件参数正是客户端的文件
* 再在后端接收Java后端发送http请求后响应回来的数据
* 最后可以对返回的数据进行处理:比如重要信息存入数据库、响应给客户端的数据进行自定义封装等等
1. 导入坐标
<!--带文件上传HTTP client配置--> | |
<dependency> | |
<groupId>org.apache.httpcomponents</groupId> | |
<artifactId>httpclient</artifactId> | |
<version>4.5.6</version> | |
</dependency> | |
<dependency> | |
<groupId>org.apache.httpcomponents</groupId> | |
<artifactId>httpmime</artifactId> | |
<version>4.5.6</version> | |
</dependency> |
package cn.kt.qinu_demo.utils; | |
import org.springframework.web.multipart.MultipartFile; | |
import sun.misc.BASE64Encoder; | |
/** | |
* @author tao | |
* @date 2021-03-28 21:58 | |
* 概要: | |
*/ | |
public class CheveretoUtil { | |
//文件上传URL | |
public static final String CHEVERETO_URL = "http://你的网址/api/1/upload/"; | |
//Chevereto API Key | |
public static final String CHEVERETO_API_KEY = "你的key"; | |
/** | |
* MultipartFile转BASE64字符串 | |
* | |
* @param file | |
* @return | |
* @throws Exception | |
*/ | |
public static String multipartFileToBASE64(MultipartFile file) throws Exception { | |
BASE64Encoder base64Encoder = new BASE64Encoder(); | |
String base64EncoderImg = base64Encoder.encode(file.getBytes()); | |
return base64EncoderImg; | |
} | |
public static String upload(MultipartFile file) throws Exception { | |
String jsonObject = null; | |
try { | |
//jsonObject = OkHttpClientUtils.sendPost(CheveretoUtil.CHEVERETO_URL + "?key=" + CHEVERETO_API_KEY + "&format=json", file); | |
//jsonObject = HttpClientUtil.gettestRestTemplate(file, CheveretoUtil.CHEVERETO_URL + "?key=" + CHEVERETO_API_KEY + "&format=json"); | |
jsonObject = HttpClientUtil.gettesthttpclient(file, CheveretoUtil.CHEVERETO_URL + "?key=" + CHEVERETO_API_KEY + "&format=json"); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
System.out.println(jsonObject); | |
return jsonObject; | |
} | |
} |
package cn.kt.qinu_demo.utils; | |
import lombok.SneakyThrows; | |
import org.apache.http.Consts; | |
import org.apache.http.HttpResponse; | |
import org.apache.http.client.config.RequestConfig; | |
import org.apache.http.client.methods.HttpPost; | |
import org.apache.http.entity.ContentType; | |
import org.apache.http.entity.mime.HttpMultipartMode; | |
import org.apache.http.entity.mime.MultipartEntityBuilder; | |
import org.apache.http.impl.client.CloseableHttpClient; | |
import org.apache.http.impl.client.HttpClients; | |
import org.apache.http.util.EntityUtils; | |
import org.apache.poi.ss.formula.functions.T; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.core.io.ByteArrayResource; | |
import org.springframework.http.HttpEntity; | |
import org.springframework.http.HttpHeaders; | |
import org.springframework.http.MediaType; | |
import org.springframework.util.LinkedMultiValueMap; | |
import org.springframework.util.MultiValueMap; | |
import org.springframework.web.client.RestTemplate; | |
import org.springframework.web.multipart.MultipartFile; | |
import javax.annotation.PostConstruct; | |
import java.io.IOException; | |
/** | |
* @author tao | |
* @date 2021-03-29 22:55 | |
* 概要: | |
*/ | |
public class HttpClientUtil { | |
/** | |
* @param file | |
* @param url 发送携带file的post请求,接收返回的数据 | |
*/ | |
@SneakyThrows | |
public static String gettesthttpclient(MultipartFile file, String url) { | |
System.out.println(url); | |
CloseableHttpClient httpclient = HttpClients.createDefault(); | |
RequestConfig requestConfig = RequestConfig.custom() | |
.setConnectionRequestTimeout(10000) | |
.setConnectTimeout(5000) | |
.build(); | |
HttpPost httpPost = new HttpPost(url); | |
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); | |
// 解决中文文件名乱码问题 | |
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); | |
entityBuilder.setCharset(Consts.UTF_8); | |
ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), Consts.UTF_8); | |
entityBuilder.addBinaryBody("source", file.getInputStream(), ContentType.DEFAULT_BINARY, file.getOriginalFilename()); | |
httpPost.setEntity(entityBuilder.build()); | |
httpPost.setConfig(requestConfig); | |
HttpResponse execute = httpclient.execute(httpPost); | |
String flag = EntityUtils.toString(execute.getEntity()); | |
return flag; | |
} | |
} |
package cn.kt.qinu_demo.controller; | |
import cn.kt.qinu_demo.utils.CheveretoUtil; | |
import com.alibaba.fastjson.JSON; | |
import com.alibaba.fastjson.JSONObject; | |
import lombok.extern.slf4j.Slf4j; | |
import org.springframework.web.bind.annotation.ResponseBody; | |
import org.springframework.web.bind.annotation.RestController; | |
import org.springframework.web.bind.annotation.PostMapping; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.multipart.MultipartFile; | |
import java.util.*; | |
/** | |
* @author tao | |
* @date 2021-03-28 21:57 | |
* 概要: | |
*/ | |
@RestController | |
@Slf4j | |
@RequestMapping("chevereto") | |
public class CheveretoController { | |
/** | |
* 商品图片上传 | |
* | |
* @param file | |
* @return | |
*/ | |
@PostMapping("/upload") | |
@ResponseBody | |
public JSONObject upload(MultipartFile file) throws Exception { | |
String str = CheveretoUtil.upload(file); | |
//将带有json格式的字符串转换为json对象 | |
JSONObject jsonObject = JSON.parseObject(str); | |
//获取转换为json对象后里面的json对象 | |
JSONObject image = jsonObject.getJSONObject("image"); | |
//获取转换为json对象后里面的属性值 | |
String url = image.getString("url"); | |
System.out.println(image); | |
System.out.println(url); | |
/**----------------------- 编写存储和返回需要的相关逻辑 ------------------------- */ | |
return jsonObject; | |
} | |
} |
url:http://localhost:8080/chevereto/upload | |
method:post | |
参数:body(file:file) |
package cn.kt.qinu_demo.utils; | |
import lombok.extern.slf4j.Slf4j; | |
import okhttp3.*; | |
import java.io.IOException; | |
import java.util.Iterator; | |
import java.util.Map; | |
import java.util.concurrent.TimeUnit; | |
/** | |
* @author tao | |
* @date 2021-03-28 22:00 | |
* 概要:OkHttp 工具类 | |
*/ | |
@Slf4j | |
public class OkHttpClientUtils { | |
private static final int READ_TIMEOUT = 150; | |
private static final int CONNECT_TIMEOUT = 100; | |
private static final int WRITE_TIMEOUT = 60; | |
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); | |
private static final byte[] LOCKER = new byte[0]; | |
private static OkHttpClientUtils mInstance; | |
private static OkHttpClient okHttpClient = new OkHttpClient(); | |
private OkHttpClientUtils() { | |
okhttp3.OkHttpClient.Builder clientBuilder = new okhttp3.OkHttpClient.Builder(); | |
// 读取超时 | |
clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS); | |
// 连接超时 | |
clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); | |
//写入超时 | |
clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); | |
okHttpClient = clientBuilder.build(); | |
} | |
/** | |
* 单例模式获取 NetUtils | |
* | |
* @return {@link OkHttpClientUtils} | |
*/ | |
public static OkHttpClientUtils getInstance() { | |
if (mInstance == null) { | |
synchronized (LOCKER) { | |
if (mInstance == null) { | |
mInstance = new OkHttpClientUtils(); | |
} | |
} | |
} | |
return mInstance; | |
} | |
/** | |
* GET,同步方式,获取网络数据 | |
* | |
* @param url 请求地址 | |
* @return {@link Response} | |
*/ | |
public Response getData(String url) { | |
// 构造 Request | |
Request.Builder builder = new Request.Builder(); | |
Request request = builder.get().url(url).build(); | |
System.out.println(request); | |
// 将 Request 封装为 Call | |
Call call = okHttpClient.newCall(request); | |
System.out.println(call); | |
// 执行 Call,得到 Response | |
Response response = null; | |
try { | |
response = call.execute(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return response; | |
} | |
/** | |
* POST 请求,同步方式,提交数据 | |
* | |
* @param url 请求地址 | |
* @param bodyParams 请求参数 | |
* @return {@link Response} | |
*/ | |
public Response postData(String url, Map<String, String> bodyParams) { | |
// 构造 RequestBody | |
RequestBody body = setRequestBody(bodyParams); | |
// 构造 Request | |
Request.Builder requestBuilder = new Request.Builder(); | |
Request request = requestBuilder.post(body).url(url).build(); | |
// 将 Request 封装为 Call | |
Call call = okHttpClient.newCall(request); | |
// 执行 Call,得到 Response | |
Response response = null; | |
try { | |
response = call.execute(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return response; | |
} | |
/** | |
* 同步 POST 请求,使用 JSON 格式作为参数 | |
* | |
* @param url 请求地址 | |
* @param json JSON 格式参数 | |
* @return 响应结果 | |
* @throws IOException 异常 | |
*/ | |
public String postJson(String url, String json) throws IOException { | |
RequestBody body = RequestBody.create(JSON, json); | |
Request request = new Request.Builder() | |
.url(url) | |
.post(body) | |
.build(); | |
Response response = okHttpClient.newCall(request).execute(); | |
if (response.isSuccessful()) { | |
return response.body().string(); | |
} else { | |
throw new IOException("Unexpected code " + response); | |
} | |
} | |
/** | |
* GET 请求,异步方式,获取网络数据 | |
* | |
* @param url 请求地址 | |
* @param myNetCall 回调函数 | |
*/ | |
public static void getDataAsync(String url, final MyNetCall myNetCall) { | |
// 构造 Request | |
Request.Builder builder = new Request.Builder(); | |
Request request = builder.get().url(url).build(); | |
// 将 Request 封装为 Call | |
Call call = okHttpClient.newCall(request); | |
// 执行 Call | |
call.enqueue(new Callback() { | |
@Override | |
public void onFailure(Call call, IOException e) { | |
myNetCall.failed(call, e); | |
} | |
@Override | |
public void onResponse(Call call, Response response) throws IOException { | |
myNetCall.success(call, response); | |
} | |
}); | |
} | |
/** | |
* 构造 POST 请求参数 | |
* | |
* @param bodyParams 请求参数 | |
* @return {@link RequestBody} | |
*/ | |
private RequestBody setRequestBody(Map<String, String> bodyParams) { | |
RequestBody body = null; | |
okhttp3.FormBody.Builder formEncodingBuilder = new okhttp3.FormBody.Builder(); | |
if (bodyParams != null) { | |
Iterator<String> iterator = bodyParams.keySet().iterator(); | |
String key = ""; | |
while (iterator.hasNext()) { | |
key = iterator.next().toString(); | |
formEncodingBuilder.add(key, bodyParams.get(key)); | |
} | |
} | |
body = formEncodingBuilder.build(); | |
return body; | |
} | |
/** | |
* POST 请求,异步方式,提交数据 | |
* | |
* @param url 请求地址 | |
* @param bodyParams 请求参数 | |
* @param myNetCall 回调函数 | |
*/ | |
public void postDataAsync(String url, Map<String, String> bodyParams, final MyNetCall myNetCall) { | |
// 构造 RequestBody | |
RequestBody body = setRequestBody(bodyParams); | |
// 构造 Request | |
buildRequest(url, myNetCall, body); | |
} | |
/** | |
* 异步 POST 请求,使用 JSON 格式作为参数 | |
* | |
* @param url 请求地址 | |
* @param json JSON 格式参数 | |
* @param myNetCall 回调函数 | |
* @throws IOException 异常 | |
*/ | |
public void postJsonAsync(String url, String json, final MyNetCall myNetCall) throws IOException { | |
RequestBody body = RequestBody.create(JSON, json); | |
// 构造 Request | |
buildRequest(url, myNetCall, body); | |
} | |
/** | |
* 构造 Request 发起异步请求 | |
* | |
* @param url 请求地址 | |
* @param myNetCall 回调函数 | |
* @param body {@link RequestBody} | |
*/ | |
private void buildRequest(String url, MyNetCall myNetCall, RequestBody body) { | |
Request.Builder requestBuilder = new Request.Builder(); | |
Request request = requestBuilder.post(body).url(url).build(); | |
// 将 Request 封装为 Call | |
Call call = okHttpClient.newCall(request); | |
// 执行 Call | |
call.enqueue(new Callback() { | |
@Override | |
public void onFailure(Call call, IOException e) { | |
myNetCall.failed(call, e); | |
} | |
@Override | |
public void onResponse(Call call, Response response) throws IOException { | |
myNetCall.success(call, response); | |
} | |
}); | |
} | |
/** | |
* 自定义网络回调接口 | |
*/ | |
public interface MyNetCall { | |
/** | |
* 请求成功的回调处理 | |
* | |
* @param call {@link Call} | |
* @param response {@link Response} | |
* @throws IOException 异常 | |
*/ | |
void success(Call call, Response response) throws IOException; | |
/** | |
* 请求失败的回调处理 | |
* | |
* @param call {@link Call} | |
* @param e 异常 | |
*/ | |
void failed(Call call, IOException e); | |
} | |
} |
package cn.kt.qinu_demo.utils; | |
import lombok.SneakyThrows; | |
import org.apache.http.Consts; | |
import org.apache.http.HttpResponse; | |
import org.apache.http.client.config.RequestConfig; | |
import org.apache.http.client.methods.HttpPost; | |
import org.apache.http.entity.ContentType; | |
import org.apache.http.entity.mime.HttpMultipartMode; | |
import org.apache.http.entity.mime.MultipartEntityBuilder; | |
import org.apache.http.impl.client.CloseableHttpClient; | |
import org.apache.http.impl.client.HttpClients; | |
import org.apache.http.util.EntityUtils; | |
import org.apache.poi.ss.formula.functions.T; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.core.io.ByteArrayResource; | |
import org.springframework.http.HttpEntity; | |
import org.springframework.http.HttpHeaders; | |
import org.springframework.http.MediaType; | |
import org.springframework.util.LinkedMultiValueMap; | |
import org.springframework.util.MultiValueMap; | |
import org.springframework.web.client.RestTemplate; | |
import org.springframework.web.multipart.MultipartFile; | |
import javax.annotation.PostConstruct; | |
import java.io.IOException; | |
/** | |
* @author tao | |
* @date 2021-03-29 22:55 | |
* 概要: | |
*/ | |
public class HttpClientUtil { | |
/** | |
* @param file | |
* @param url 发送携带file的post请求,接收返回的数据 | |
*/ | |
@SneakyThrows | |
public static String gettesthttpclient(MultipartFile file, String url) { | |
System.out.println(url); | |
CloseableHttpClient httpclient = HttpClients.createDefault(); | |
RequestConfig requestConfig = RequestConfig.custom() | |
.setConnectionRequestTimeout(10000) | |
.setConnectTimeout(5000) | |
.build(); | |
HttpPost httpPost = new HttpPost(url); | |
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); | |
// 解决中文文件名乱码问题 | |
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); | |
entityBuilder.setCharset(Consts.UTF_8); | |
ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), Consts.UTF_8); | |
entityBuilder.addBinaryBody("source", file.getInputStream(), ContentType.DEFAULT_BINARY, file.getOriginalFilename()); | |
httpPost.setEntity(entityBuilder.build()); | |
httpPost.setConfig(requestConfig); | |
HttpResponse execute = httpclient.execute(httpPost); | |
String flag = EntityUtils.toString(execute.getEntity()); | |
return flag; | |
} | |
} |
本次下载的项目源码包含
1. 七牛云API文件上传源码(上一篇博客:文件上传——七牛云)
2. chevereto图床API开发源码
评论列表 (条)