实现思路:
1.在github创建access_token
2.确定请求路径及发送的数据格式
3.代码实现
一、在github创建access_token
1.登录自己的账号,然后进入网站https://github.com/settings/tokens
2.在这里选择Generate new token
创建新的token
3.下面这一步很重要。一定要复制你的token
,它只显示一次
二、确定请求路径及发送的数据格式
官方api文档:https://developer.github.com/v3/repos/contents/
下图为官方API文档中的截图:
由文档可以看出,上传文件或更新文件的请求路径为:
https://api.github.com/repos/github用户名/仓库名/contents/文件上传路径
例如:
https://api.github.com/repos/raingnight/Blog_pic/contents/a/test1.jpg
发送的数据应该使用json
格式,其中一定需要以下内容:
message
: 提交说明,
content
: 要上传的文件的base64
编码
committer
: 提交者的信息,也是一个json
对象,其中应包括:
name
: 提交的作者名称
例如:
{
"committer":
{
"name":"raingnight",
"email":"17849***98@qq.com"
},
"message":"new pic",
"content":"/9j/4AAQSkZJRgABA"
}
三、代码实现
环境:eclipse+servlet+html
首先是html页面的代码:
一个文件选择按钮,一个提交按钮
点击选择文件按钮,选择文件后,js
自动将文件转为base64
编码
然后点击提交按钮,通过jqurey
发送一个ajax
请求,将文件的base64
编码发到servlet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input type="file" id="imgurl" capture="camera" accept="image/png,image/gif,image/jpeg" />请选择文件
<input type="button" value="submit" />
</body>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script>
var result;
$('input[type=file]').on(
'change',
function() {
var reader = new FileReader();
reader.onload = function(e) {
// alert(reader.result); //或者 e.target.result都是一样的,都是base64码
result = reader.result;
}
reader.readAsDataURL(this.files[0])
//filses就是input[type=file]文件列表,files[0]就是第一个文件,这里就是将选择的第一个图片文件转化为base64的码
}
);
$('input[type=button]').click(function() {
console.log(result);
var data = "content="+result;
$.ajax({
type: "post",
url: "UploadServlet",
data: data,
success: function(msg) {
console.log(msg);
}
});
});
</script>
</html>
前端ajax
发送数据之后,servlet
接收数据,并拼装成json
数据
servlet
代码:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import utils.TestUpload;
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String content = request.getParameter("content");
String access_token= "这里放自己的token";
System.out.println("接受到的base64: "+content);
//committer信息
JSONObject committer = new JSONObject();
committer.put("name", "github名");
committer.put("email", "邮箱");
//要发送的json
JSONObject json = new JSONObject();
json.put("message", "提交文件的说明");
//去除接收到的base64编码,避免提交的数据不是base64编码导致失败
json.put("content", content.split(",")[1].trim().replace("%", "").replace(",", "").replace(" ", "+"));
json.put("committer", committer);
System.out.println(json);
//要保存的文件名,可以带文件夹,不存在会自动创建,如a/test.jpg
String filename = "test27.jpg";
String url = "https://api.github.com/repos/raingnight/Blog_pic/contents/"+filename+"?access_token="+access_token;
TestUpload testUpload = new TestUpload(json, url);
Thread t = new Thread(testUpload);
t.run();
response.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = response.getWriter();
printWriter.print("开始执行");//向请求方返回数据,可做判断后返回成功或失败等信息
printWriter.close();
}
}
其他类
TestUpload.java 用于发送HttpPut请求
package utils;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONObject;
public class TestUpload implements Runnable {
private String url;
private JSONObject json;
/**
*
* @param json
* "message": "提交说明",
* "content": "将文件base64编码后的字符串",
* commiter:{
* "name": "名字",
* "email": "邮箱"
* }
*/
public TestUpload(JSONObject json,String url) {
this.json = json;
this.url = url;
}
public void run() {
// 设置编码
String encode = "utf-8";
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
// 创建Http连接 以put方法请求url
HttpPut httpput = new HttpPut(url);
// 设置请求的header信息
/** header中通用属性 */
httpput.setHeader("Accept", "*/*");
httpput.setHeader("Accept-Encoding", "gzip, deflate");
httpput.setHeader("Cache-Control", "no-cache");
httpput.setHeader("Connection", "keep-alive");
httpput.setHeader("Content-Type", "application/json;charset=UTF-8");
/** 业务参数 */
// httpput.setHeader("Authorization", "你的token");
// 组织请求参数
/** 按encode编码格式将String数据转为请求的实体对象 */
StringEntity stringEntity = new StringEntity(json.toJSONString(), encode);
// 将请求的实体绑定到http请求上
httpput.setEntity(stringEntity);
String content = null;// 回复的内容
CloseableHttpResponse httpResponse = null;// 回复对象
try {
// 响应信息
httpResponse = closeableHttpClient.execute(httpput);// 执行请求
HttpEntity entity = httpResponse.getEntity();// 接收响应
content = EntityUtils.toString(entity, encode);// 将响应转为String类型
} catch (Exception e) {
e.printStackTrace();
} finally {// 关闭资源
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
closeableHttpClient.close(); // 关闭连接、释放资源
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(content);
// return content;//返回响应内容
}
}
对我很有帮助,实现了某个功能,感谢大佬分享!
哈哈,有用就好!
评论时间是不是不对劲
是的,差了8个小时,有空再修复