ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)

七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/1237/csharp

UpoladService示例代码:

public class UpoladService : IUpoladService
{
    private readonly static string[] _p_w_picpathExtensions = new string[] { ".jpg", ".png", ".gif", ".jpeg", ".bmp" };
    private AppSettings _appSettings;

    public UpoladService(IOptions appSettings)
    {
        _appSettings = appSettings.Value;
    }

    public async Task UploadStream(Stream stream, string fileName, AppType appType)
    {
        if (stream == null)
        {
            return SubmitResult.Fail("图片为null");
        }
        if (string.IsNullOrWhiteSpace(fileName))
        {
            return SubmitResult.Fail("图片名称为空");
        }
        try
        {
            var extensionName = fileName.Substring(fileName.LastIndexOf("."));
            if (!_p_w_picpathExtensions.Contains(extensionName.ToLower()))
            {
                return SubmitResult.Fail("图片格式有误");
            }
            var generateFileName = $"{DateTime.Now.ToString("yyyyMMddHHmmssfff-")}{Guid.NewGuid().GetHashCode().ToString().Replace("-", string.Empty)}{extensionName}";
            var saveKey = $"wl/{appType.ToString().ToLower()}/{generateFileName}";

            // 生成(上传)凭证时需要使用此Mac
            // 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
            // 实际应用中,请自行设置您的AccessKey和SecretKey
            Mac mac = new Mac(_appSettings.AccessKey, _appSettings.SecretKey);
            // 上传策略,参见 
            // https://developer.qiniu.com/kodo/manual/put-policy
            PutPolicy putPolicy = new PutPolicy();
            // 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
            // putPolicy.Scope = bucket + ":" + saveKey;
            putPolicy.Scope = _appSettings.Bucket;
            // 上传策略有效期(对应于生成的凭证的有效期)   
            putPolicy.SetExpires(3600);
            // 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
            //putPolicy.DeleteAfterDays = 1;

            // 生成上传凭证,参见
            // https://developer.qiniu.com/kodo/manual/upload-token            
            string jstr = putPolicy.ToJsonString();
            string token = Auth.CreateUploadToken(mac, jstr);

            FormUploader fu = new FormUploader();
            var result = await fu.UploadStreamAsync(stream, saveKey, token);
            if (result.Code == 200)
            {
                return SubmitResult.Success($"{_appSettings.Domain}/{saveKey}");
            }
            return SubmitResult.Fail("上传失败");
        }
        catch (Exception ex)
        {
            return SubmitResult.Fail($"上传失败:{ex.Message}");
        }
    }
}

UploadController示例代码:

[EnableCors("default")]
[Route("upload")]
public class UploadController : WebApiController
{
    private IUpoladService _upoladService;

    public UploadController(IUpoladService upoladService)
    {
        _upoladService = upoladService;
    }

    [Route("{appType}/stream")]
    [HttpPost]
    public async Task UploadByStream(AppType appType)
    {
        if (Request.Form.Files.Count == 0)
        {
            return Fail("图片不存在");
        }
        var file = Request.Form.Files[0];
        var result = await _upoladService.UploadStream(file.OpenReadStream(), file.FileName, appType);
        if (result.IsSuccess)
        {
            return Ok(new { pic_url = result.Data, is_success = true });
        }
        return Fail(result.Message);
    }

    [Route("{appType}/base64")]
    [HttpPost]
    public async Task UploadByBase64([FromBody]JObject data, AppType appType)
    {
        var p_w_picpathBase64 = data["p_w_picpath_base64"].ToObject();
        var fileName = data["file_name"].ToObject();
        if (!string.IsNullOrWhiteSpace(p_w_picpathBase64))
        {
            var reg = new Regex("data:p_w_picpath/(.*);base64,");
            p_w_picpathBase64 = reg.Replace(p_w_picpathBase64, "");
            byte[] p_w_picpathByte = Convert.FromBase64String(p_w_picpathBase64);
            var stream = new MemoryStream(p_w_picpathByte);

            var result = await _upoladService.UploadStream(stream, fileName, appType);
            if (result.IsSuccess)
            {
                return Ok(new { pic_url = result.Data, is_success = true });
            }
            return Fail(result.Message);
        }
        return Json(new { success = false, result = "请选择文件!" });
    }
}

JS 上传图片示例代码: