Tìm kiếm


    Sử dụng Github API Upload File Hình Ảnh với ASP.NET Core


    Giới thiệu

    Chắc hẳn các bạn chẳng còn xa lạ gì với Github rồi đúng không nào? 

    Nhưng trong bài viết này mình sẽ không chỉ các bạn dùng Github đâu mà sẽ chỉ cho các bạn một trò hay hơn.

    Cụ thể là dùng Github API để Upload và lưu trữ hình ảnh.

    Vậy tại sao lại là Github mà không phải các Service khác như Cloudiary, Imgur, Pixel... Tất cả các bên kể trên đều rất nổi tiếng và không những còn support nhiều cái hay hơn cho việc lưu trữ hình ảnh.

    Câu trả lời là chúng giới hạn dung lượng upload và đôi khi việc đăng ký còn khó khăn VD như Imgur thì các bạn cần có số điện thoại bên nước ngoài, Cloudiary thì lại chỉ giới 2GB hình ảnh với tài khoản Free.

    Với những hạn chế trên thì Github cân hết tất cả. Các bạn lưu bao nhiêu cũng được không giời hạn dung lượng. Tốc độ thì khỏi phải bàn.

    Oke vậy làm thể nào để sử dụng API của Github để upload hình ảnh thì mời các bạn cùng theo mình đi vào nghịch ngợm nhé !

    Chuẩn bị

    Trước tiên thì các bạn cần chuẩn bị những thứ sau:

    • 1. Tài khoản Github. Đăng ký tại đây nhé các bạn https://github.com
    • 2. .NET Core 6

    Bạn nào dùng ngôn ngữ khác thì follow theo code của mình vẫn có thể làm được nhé

    Vào phần chính thôi nào

    Tạo Github Access Token

    Để có thể sử dụng được Github API thì cần có Token của Github. Các bạn vào như sau:

    B1: Truy cập vào https://github.com/settings/tokens để tạo ra một token mới

    Chọn Personal access tokens -> Tokens (classic) -> Generate new token -> Generate new token (classic)

    dá

    B2: Điền thông tin Token

    • - Note: Điền tên token mà các bạn muốn
    • - Expiration: Chọn No Expiration
    • - Select scopes: Các bạn chọn full access cho repo nhé

    đá

    Xong rồi kéo xuống và nhận Generate token

    B3: Copy Token vừa tạo được ra một bên để xíu sử dụng :D

    đá

    Tạo Git Repo

    Tiếp theo chúng ta sẽ tạo ra một Repo mới để lưu file ảnh vào đó.

    B1: Các bạn truy cập vào link https://github.com/new hoặc click vào button new tại trang chủ của các bạn như hình dưới

    đasa

    B2: Điền thông tin của Repo

    đasa

    Các bạn để Public để bên ngoài có thể truy xuất đc nhé. Hoặc Private nếu không muốn người khác thấy.

    Xong rồi nhấn Create new repository

    Code Upload hình ảnh

    Ở đây hình sử dụng ASP/NET Core nhé các bạn. 

    Các bạn tạo ra một ứng dụng ASP.NET Core Web Application mới

    Config file appsettings.json

    Trong file appsettings.json thêm đoạn code như sau:

      "GithubAPI": {
        "AccessToken": "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",
        "BaseUrl": "https://api.github.com/repos/huynxtb/CodeMegaImage/contents",
        "Branch": "main"
      },

    Trong đó:

    • - AccessToken: là phần token đã tạo được ở phần Tạo Github Access Token
    • - BaseUrl: là api của repo của các bạn. Các bạn xem tiếp bên dưới để lấy BaseUrl nhé
    • - Branch: mặc định là main. Các bạn muốn change qua brach khác cũng được nhé. Tùy các bạn :v

    Bên trên là BaseUrl repo của mình. Các bạn sửa lại thành như sau:

    Truy cập vào repo đã tạo sau đó trên thanh URL của Browser các bạn sẽ thấy tên người dùng của các bạn cùng với repo name

    đâs

    Ở đây tên người dùng của mình là huynxtb repo name là CodeMegaImage

    Phần Code chính

    Dưới đây là phần code mà mình sử dụng để Upload hình ảnh lên Github

    public async Task UploadImageAsync(IFormFile file, string folderSource)
        {
            var fileName = ToFileName(file);
            var commit = DateTime.Now.ToString("MM/dd/yyyy hh:mm tt").Replace("/", "_");
            
            await using MemoryStream ms = new();
            await file.CopyToAsync(ms);
    
            var fileBytes = ms.ToArray();
            
            RestRequest request = new() { Method = Method.Put };
    
            request.AddHeader("Authorization", "Token " + _configuration["GithubAPI:AccessToken"]);
            request.AddHeader("accept", "application/vnd.github.v3+json");
            request.AddJsonBody(
                new
                {
                    message = commit,
                    content = Convert.ToBase64String(fileBytes),
                    branch = _configuration["GithubAPI:Branch"]
                });
    
            var client = new RestClient($"{_configuration["GithubAPI:BaseUrl"]}/{folderSource}/{fileName}");
    
            var response = await client.ExecuteAsync(request);
            var jsonGit = response.Content?.Replace("download_url", "downloadUrl");
    
            if (jsonGit == null)
            {
                return new GitResponseModel { Success = false };
            }
    
            var resGit = JsonConvert.DeserializeObject(jsonGit);
            
            if (resGit == null)
            {
                return new GitResponseModel { Success = false };
            }
    
            resGit.Success = true;
    
            return resGit;
        }

    Phần code khá là đơn giản. Mình sử dụng RestSharp để thực hiện call tới API của Github để upload file với method là PUT.

    #Note: Parameter string folderSource các bạn nếu chưa có folder trên Github thì nó sẽ tự tạo ra nhé. Còn nếu có rồi thì nó sẽ ghi tiếp vào folder cũ chứ không ghi đè

    Do chưa bên Github chưa hỗ trợ Upload thằng cái file qua API (hoặc là do mình non mình chưa biết cách gửi hehe) nên mình có convert file ra Base64 trước khi push lên bằng cách dùng hàm Convert.ToBase64String(fileBytes).

    Sau khi thực hiện push lên thì mình trả về model mà mình đã tạo có tên là GitResponseModel (như bên dưới) để chứa data Json mà bên Github trả về

    public class GitResponseModel
    {
        [JsonPropertyName("content")] public ContentResponse? Content { get; set; }
        public bool Success { get; set; }
    }
    
    public class ContentResponse
    {
        [JsonPropertyName("name")] public string? Name { get; set; }
    
        [JsonPropertyName("path")] public string? Path { get; set; }
    
        [JsonPropertyName("sha")] public string? Sha { get; set; }
    
        [JsonPropertyName("size")] public int Size { get; set; }
    
        [JsonPropertyName("url")] public string? Url { get; set; }
    
        [JsonPropertyName("downloadUrl")] public string? DownloadUrl { get; set; }
    
        [JsonPropertyName("type")] public string? Type { get; set; }
    }

    Controller

    [HttpPost]
    public async Task Upload(IFormFile imageFile)
    {
        var folderName = "User";
    
        var res = await _githubApiService.UploadImageAsync(imageFile, folderName);
            
        return RedirectToAction("ResponseData", new { fileURL = res.Content?.DownloadUrl });
    }
        
    [HttpGet]
    public IActionResult ResponseData(string fileURL)
    {
        return Json(new
        {
            FileURL = fileURL
        });
    }

    Phần Controller mình xử lý đơn giản như trên. Khi thực hiện tại Action Upload xong mình sẽ cho Redirect tới ResponseData kèm theo đó là Link của hình ảnh mà Github trả về

    Giao diện App

    <div class="text-center">
        <h2 class="display-4">Code Mega Upload Image With Github API</h2>
    </div>
    
    <div class="form-control">
        <form enctype="multipart/form-data" method="POST" action="/File/Upload">
            
            <label for="file">Choose Image:</label><br><br>
            
            <input type="file" id="file" name="imageFile"><br><br>
    
            <input type="submit" value="Submit">
            
        </form>
    </div>

    Phần UI thì đơn giản thôi. Mình tạo ra cái Form xong submit về là xong. Hơi xấu tí nhưng chạy ngon

    đâs

    Tận hưởng thành quả

    Sau khi code chăm chỉ thì đây là kết quả của mình:

    đâs

    Quả response quá uy tín luôn 😎

    đasa

    đấ

    đấ

    Tạm kết

    Trên đây là toàn bộ bài viết chia sẻ của mình về cách Upload hình ảnh lên Github bằng Github API. Nếu các bạn thấy hay thì chia sẻ giúp mình nhé !

    Cám ơn các bạn đã theo dõi. 

    Các bạn xem các tải code ở bên dưới nhé ! Hẹn các bạn ở các bài viết tiếp theo. PP


    Tiểu sử
    Are you one or zero?


    Bình luận