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

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

UpoladService示例代码:

public class UpoladService : IUpoladService
{
private readonly static string[] _imageExtensions = new string[] { ".jpg", ".png", ".gif", ".jpeg", ".bmp" };
private AppSettings _appSettings; public UpoladService(IOptions<AppSettings> appSettings)
{
_appSettings = appSettings.Value;
} public async Task<SubmitResult> 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 (!_imageExtensions.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<IActionResult> 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<IActionResult> UploadByBase64([FromBody]JObject data, AppType appType)
{
var imageBase64 = data["image_base64"].ToObject<string>();
var fileName = data["file_name"].ToObject<string>();
if (!string.IsNullOrWhiteSpace(imageBase64))
{
var reg = new Regex("data:image/(.*);base64,");
imageBase64 = reg.Replace(imageBase64, "");
byte[] imageByte = Convert.FromBase64String(imageBase64);
var stream = new MemoryStream(imageByte); 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 上传图片示例代码:

<form method="post" enctype="multipart/form-data">
<input type="file" id="files"
name="files" multiple />
<input type="button"
id="uploadStream"
value="Upload Selected Files" /> <input type="button"
id="uploadBase64"
value="Upload Selected Files" />
</form> <script>
$(document).ready(function () {
$("#upload").click(function (evt) {
var fileUpload = $("#files").get(0);
var files = fileUpload.files;
var data = new FormData();
for (var i = 0; i < files.length; i++) {
data.append(files[i].name, files[i]);
}
$.ajax({
type: "POST",
url: "http://localhost:5002/upload/avatar/stream",
processData: false,
contentType: false,
data: data,
success: function (data) {
if (data.is_success) {
console.log(data.pic);
}
else {
console.log(data.msg);
}
console.log(data);
},
error: function () {
console.log("There was error uploading files!");
}
});
}); $("#uploadBase64").click(function (evt) {
var fileUpload = $("#files").get(0);
var files = fileUpload.files;
var data = {}; //生成base64
var reader = new FileReader();
reader.readAsDataURL(files[0]);
reader.onload = function () {
data.image_base64 = reader.result;
data.file_name = files[0].name; $.ajax({
type: "POST",
url: "http://localhost:5002/upload/avatar/base64",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data),
dataType: 'json',
success: function (data) {
if (data.is_success) {
console.log(data.pic);
}
else {
console.log(data.msg);
}
console.log(data);
},
error: function () {
console.log("There was error uploading files!");
}
});
return reader.result;
};
reader.onerror = function (error) {
console.log('Error: ', error);
};
});
});
</script>

ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)的更多相关文章

  1. 七牛图片上传JSSDK

    BASE64图片上传 接口说明: POST /putb64/<Fsize>/key/<EncodedKey>/mimeType/<EncodedMimeType>/ ...

  2. .Net Core 图片上传FormData和Base64

    缓冲和流式传输是上传文件的两种常用方案,这里主要演示流式传输. 1.Net Core MVC Form提交方式: 前端页面 form表单提交: <form id="uploadForm ...

  3. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传

    step1:引入文件 引入Plupload *该SDK上传功能集于Plupload插件封装,所以需要下载Plupload; plupload.dev.js 引入qiniu.js为了简便,当时直接从官网 ...

  4. 图床工具PicGO实现七牛云图片上传

    图床工具PicGO实现七牛云图片上传 我们在写博客或者网络文章时经常需要上传图片.目前最有名气的图床工具就是PicGO. 简单的界面,完整的功能,在相册里也能直接复制markdown图片链接.一直深受 ...

  5. ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

    前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...

  6. 一个简单的安卓+Servlet图片上传例子

    例子比较 简单,服务端为Java Web Servlet,doPost方法中接收图片并保存,然后将保存的图片名返回给客户端,关键代码: @SuppressWarnings("deprecat ...

  7. Asp.net中FileUpload控件实现图片上传并带预览显示

    单一图片上传——“选择”+“上传”,.NET默认模式: 1.实现原理:     采用FileUpload控件默认的使用方式,先由“选择”按钮选择图片,然后单击“上传”按钮完成上传,并可在“上传”按钮的 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...

  9. 项目回顾3-再谈图片上传-FormData+ajax上传

    上次在纠结图片上传用base64还是form表单,现在感觉好蠢,因为又开辟了第三条道路. 其实也根本用不到form 只需要一个上传文件的input就好了 <input id="file ...

随机推荐

  1. Tesseract-OCR的简单使用与训练

    Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Docu ...

  2. Linux 开机、重启和用户登录注销、用户管理

    关机&重启命令 shutdown shutdown -h now:表示立即关机 shutdown -h 1:表示1分钟后关机 shutdown -r now:立即重启 halt 就是直接使用, ...

  3. codeforces 1041A Heist

    electronic a.电子的 heist v.抢劫 in ascending order 升序 indice n.标记 device n.装置设备 staff n.职员 in arbitrary ...

  4. MySQL 8.0 新增SQL语法对窗口函数和CTE的支持

    尝试了一下MySQL 8.0的部分新特性. 如果用过MSSQL或者是Oracle中的窗口函数(Oracle中叫分析函数), 然后再使用MySQL 8.0之前的时候,就知道需要在使用窗口函数处理逻辑的痛 ...

  5. linux学习资料收藏

      http://blog.chinaunix.net/uid/10167808/abstract/1.html?year=2008     http://linux.linuxidc.com/ind ...

  6. 【原】The Linux Command Line - Manipulation Files And Directories

    cp - Copy Files and directories mv - move/rename files and directories mkdir - create directories rm ...

  7. 使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送

    业务分析: 最近工作需要,需要从FTP读取图片内容,添加到邮件正文发送.发送邮件正文,添加附件采用Spring的MimeMessageHelper对象来完成,添加图片也将采用MimeMessageHe ...

  8. linux环境:创建数据库用户,表空间,启动数据库

    1.启动数据库 首先使用oracle用户登录Linux,然后在shell命令行中执行下面的命令:第一步:打开Oracle监听(先查看状态:oracle监听是否启动:lsnrctl status)$ l ...

  9. node.js中express的Router路由的使用

    express中的Router作用就是为了方便我们更好的根据路由去分模块.避免将所有路由都写在入口文件中. 一.简单的使用Router const express = require('express ...

  10. node.js中 express + multer 处理文件上传

    multer中间件,可以很方便的结合express处理用户表单上传的文件. 一.安装multer npm install multer 二.处理单个文件上传 const express = requi ...