实现思路:

1.在github创建access_token

2.确定请求路径及发送的数据格式

3.代码实现


一、在github创建access_token

1.登录自己的账号,然后进入网站https://github.com/settings/tokens


上传文件的 api
上传文件的 api

2.在这里选择Generate new token创建新的token


上传文件的 api
上传文件的 api

3.下面这一步很重要。一定要复制你的token,它只显示一次


上传文件的 api
上传文件的 api

二、确定请求路径及发送的数据格式

官方api文档:https://developer.github.com/v3/repos/contents/

下图为官方API文档中的截图:


上传文件的 api
上传文件的 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 : 提交的作者名称

email : 电子邮件

例如:

{
"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;//返回响应内容
    }

}

项目地址:https://github.com/raingnight/UploadImage