Giới thiệu
Chắc nhiều bạn khi làm ứng dụng hoặc web sẽ gặp phải trường hợp là upload và lưu trữ file đúng không? Và các bạn chọn giải pháp nào? Lưu trực tiếp trên con Server hay sử dụng dịch vụ thứ 3.
Với mình thì mình sẽ sử dụng dịch vụ bên thứ 3 do nó khá tiện và an toàn nữa. Và đặc biệt nhiều bên nó cho dung lượng lưu trữ khá lớn.
Có khá là nhiều lựa chọn khi sử dụng dịch vụ lưu trữ đám mây hiện nay như Google Drive, Dropbox, FileCloud, Mega.io.Tất cả chúng đều rất ngon và free nhiều dung lượng.
Nhưng trong bài này mình sẽ hướng dẫn các bạn về Mega.io.
Google Drive, Dropbox, FileCloud mình sẽ có bài viết riêng nhé. Các bạn nhớ theo dõi Blog của mình nhé.
Mega.io là gì?
Mega.io là một dịch vụ lưu trữ và chia sẻ tập tin trực tuyến được phát triển bởi Kim Dotcom, người sáng lập ra của MegaUpload. Nó cho phép người dùng tải lên và chia sẻ các tập tin lớn mà không cần qua một tải trọng trung gian.
Mega.io cung cấp miễn phí 50 GB dung lượng lưu trữ cho mỗi tài khoản và có thể mua thêm dung lượng lưu trữ.
Chuẩn bị
Trước tiên thì các bạn cần chuẩn bị những thứ sau:
Nuget
Ở đây mình sẽ sử dụng Nuget MegaApiClient kết nối với Mega Service
Config appsettings.json
Trong file appsettings.json các bạn thêm đoạn code sau:
"MegaAPI": {
"Email": "[email protected]",
"Password": "[email protected]"
},
Trong đó Email là tên tài khoản mà bạn đã đăng ký tại Mega.io còn Password thì là mật khẩu thôi :D
MegaService.cs
Mình sẽ tạo ra một class là MegaService và viết các hàm xử lý Upload, Delete, Download và Lấy thông tin các file hiện có từ Mega.io về.
GetListAsync dùng để lấy tất cả các file trong folder ra
public async Task> GetListAsync(string folder)
{
var listFile = new List();
var megaClient = new MegaApiClient();
await megaClient.LoginAsync(_configuration["MegaAPI:Email"], _configuration["MegaAPI:Password"]);
IEnumerable? nodes = await megaClient.GetNodesAsync();
var nodeFolder = nodes.SingleOrDefault(x => x.Type == NodeType.Directory && x.Name == folder);
var nodeByFolder = await megaClient.GetNodesAsync(nodeFolder);
var files = nodeByFolder.Where(x => x.Type == NodeType.File);
foreach (var file in files)
{
var downloadUrl = await megaClient.GetDownloadLinkAsync(file);
listFile.Add(new MegaIOModel()
{
FileName = file.Name,
FileSize = FileHelper.ToFileSize(file.Size),
DownloadUrl = downloadUrl.ToString()
});
}
return listFile;
}
UploadAsync dùng để upload file
public async Task UploadAsync(IFormFile file, string folder)
{
using var memoryStream = new MemoryStream();
var megaClient = new MegaApiClient();
await file.CopyToAsync(memoryStream);
await megaClient.LoginAsync(_configuration["MegaAPI:Email"], _configuration["MegaAPI:Password"]);
IEnumerable? nodes = await megaClient.GetNodesAsync();
var root = nodes.First(x => x.Type == NodeType.Directory && x.Name == folder);
if (root == null)
{
throw new Exception("Mega folder not found.");
}
var myFile = await megaClient.UploadAsync(memoryStream, file.FileName, root);
var megaUrl = await megaClient.GetDownloadLinkAsync(myFile);
await megaClient.LogoutAsync();
return megaUrl.ToString();
}
DeleteAsync xóa file
public async Task DeleteAsync(string url)
{
var megaClient = new MegaApiClient();
await megaClient.LoginAsync(_configuration["MegaAPI:Email"], _configuration["MegaAPI:Password"]);
var fileLink = new Uri(url);
var node = await megaClient.GetNodeFromLinkAsync(fileLink);
IEnumerable? nodes = await megaClient.GetNodesAsync();
var allFiles = nodes.Where(n => n.Type == NodeType.File).ToList();
var myFile = allFiles.FirstOrDefault(f => f.Name == node.Name);
await megaClient.DeleteAsync(myFile, false);
await megaClient.LogoutAsync();
}
DownloadAsync tải file
public async Task DownloadAsync(string url)
{
var megaClient = new MegaApiClient();
await megaClient.LoginAnonymousAsync();
var fileLink = new Uri(url);
var stream = await megaClient.DownloadAsync(fileLink);
await megaClient.LogoutAsync();
return stream;
}
Controller
Tiếp đến là gọi lần lượt các hàm đã viết ở trên vào Controller để sử dụng thôi
public async Task Index()
{
var data = await _megaService.GetListAsync("CodeMega");
return View(data);
}
[HttpPost]
public async Task UploadFile(IFormFile file)
{
var folderName = "CodeMega";
await _megaService.UploadAsync(file, folderName);
return Redirect("/");
}
[HttpPost]
public async Task DeleteFile(string downloadUrl)
{
await _megaService.DeleteAsync(downloadUrl);
return Redirect("/");
}
[HttpGet]
public async Task DownloadFile(string downloadUrl, string fileName)
{
var data = await _megaService.DownloadAsync(downloadUrl);
return File(data, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
#Note: Các bạn chú ý ở action UploadFile có biến là folderName = CodeMega đây là tên folder mà mình đã tạo trong cloud Mega của mình. Vì vậy các bạn cần thay đổi tại bằng folder của các bạn nhé

Code UI
Còn đây là phần code giao diện của mình:
<div class="text-center">
<h1 class="display-4">Upload/Download File with <a href="https://mega.io/">Mega.IO</a></h1>
<p><a href="https://code-mega.com">code-mega.com</a>.</p>
</div>
<div class="form-control">
<form enctype="multipart/form-data" method="POST" action="/Home/UploadFile">
<label for="file">Choose File To Upload:</label><br><br>
<input type="file" id="file" name="File"><br><br>
<input type="submit" value="Submit">
</form>
</div>
<table>
<tr>
<th>File Name</th>
<th>File Size</th>
<th>Delete</th>
<th>Download</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.FileName</td>
<td>@item.FileSize</td>
<td>
<form method="POST" action="/Home/DeleteFile">
<input value="@item.DownloadUrl" type="hidden" name="DownloadUrl"/>
<input type="submit" value="Delete"/>
</form>
</td>
<td>
<form method="GET" action="/Home/DownloadFile">
<input value="@item.DownloadUrl" type="hidden" name="DownloadUrl"/>
<input value="@item.FileName" type="hidden" name="FileName"/>
<input type="submit" value="Download"/>
</form>
</td>
</tr>
}
</table>
Tận hưởng thành quả
Các bạn click vào phần Demo bên dưới để coi kết quả nhé kkk.
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, Download file với Mega.io. Hi vọng có thể giúp ích được cho các ban.
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.