using System.Runtime.Serialization.Json;
using System.Threading.Tasks;
private static readonly string ApiKey = "SHhYYcYSpIaRuvl1lveTaPhUdItGSxhC";
private static readonly string ApiUrl = "https://sm.ms/api/v2/upload";
static async Task Main(string[] args)
Console.WriteLine("Please provide at least one file path.");
foreach (string filePath in args)
string url = await UploadFileAsync(filePath);
if (!string.IsNullOrEmpty(url))
private static async Task<string> UploadFileAsync(string filePath)
string decodedFilePath = Uri.UnescapeDataString(filePath);
if (!File.Exists(decodedFilePath))
Console.WriteLine("File not found: " + decodedFilePath);
var request = (HttpWebRequest)WebRequest.Create(ApiUrl);
string boundary = "---------------------------" + Guid.NewGuid().ToString();
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Headers.Add("Authorization", ApiKey);
var boundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
var endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
using (var requestStream = await request.GetRequestStreamAsync())
await requestStream.WriteAsync(boundaryBytes, 0, boundaryBytes.Length);
string fileHeader = "Content-Disposition: form-data; name=\"smfile\"; filename=\"" + Path.GetFileName(decodedFilePath) + "\"\r\nContent-Type: application/octet-stream\r\n\r\n";
var fileHeaderBytes = Encoding.UTF8.GetBytes(fileHeader);
await requestStream.WriteAsync(fileHeaderBytes, 0, fileHeaderBytes.Length);
byte[] fileContent = await File.ReadAllBytesAsync(decodedFilePath);
await requestStream.WriteAsync(fileContent, 0, fileContent.Length);
await requestStream.WriteAsync(endBoundaryBytes, 0, endBoundaryBytes.Length);
using (var response = (HttpWebResponse)await request.GetResponseAsync())
using (var responseStream = response.GetResponseStream())
var serializer = new DataContractJsonSerializer(typeof(ApiResponse));
var result = (ApiResponse)serializer.ReadObject(responseStream);
Console.WriteLine("Upload failed: " + result.Message);
Console.WriteLine("Exception: " + ex.Message);
[System.Runtime.Serialization.DataContract]
private class ApiResponse
[System.Runtime.Serialization.DataMember(Name = "success")]
public bool Success { get; set; }
[System.Runtime.Serialization.DataMember(Name = "data")]
public ApiResponseData Data { get; set; }
[System.Runtime.Serialization.DataMember(Name = "message")]
public string Message { get; set; }
[System.Runtime.Serialization.DataContract]
private class ApiResponseData
[System.Runtime.Serialization.DataMember(Name = "url")]
public string Url { get; set; }