1.在github创建access_token 2.确定请求路径及发送的数据格式 3.代码实现
1.在github创建access_token
2.确定请求路径及发送的数据格式
3.代码实现
1.登录自己的账号,然后进入网站 https://github.com/settings/tokens
2.在这里选择 Generate new token 创建新的token
Generate new token
3.下面这一步很重要。一定要复制你的 token ,它只显示一次
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 格式,其中一定需要以下内容:
json
message : 提交说明, content : 要上传的文件的 base64 编码 committer : 提交者的信息,也是一个 json 对象,其中应包括: name : 提交的作者名称 email : 电子邮件
message : 提交说明,
message
content : 要上传的文件的 base64 编码
content
base64
committer : 提交者的信息,也是一个 json 对象,其中应包括:
committer
name : 提交的作者名称 email : 电子邮件
name : 提交的作者名称
name
email : 电子邮件
email
{ "committer": "name":"raingnight", "email":"17849***[email protected]" "message":"new pic", "content":"/9j/4AAQSkZJRgABA" }
环境:eclipse+servlet+html
首先是html页面的代码:
一个文件选择按钮,一个提交按钮
点击选择文件按钮,选择文件后, js 自动将文件转为 base64 编码
js
然后点击提交按钮,通过 jqurey 发送一个 ajax 请求,将文件的 base64 编码发到 servlet
jqurey
ajax
servlet
<!DOCTYPE html> <html lang="en"> <meta charset="UTF-8"> <title></title> </head> <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;//返回响应内容 }