当前位置: 首页 > news >正文

使用.Net Core+IView+Vue集成上传图片功能

最近的项目里有上传图片的功能,当然这个功能在项目里是必须要有的,那么目前这个项目是使用完全的前后端分离,在选择文件上传的组件中还是选择了全面支持Vue的IView,任何上传图片都是通过HTTP请求,服务端从request中读,那么思路有了,直接创建webapi项目吧。

一般来说,在.net core中静态文件应该放到wwwroot,在其中创建一个文件夹。

再做好跨域的东西,一般都是通过cors包。创建控制器,代码如下:

    public class IndexController : ControllerBase
    {
        [HttpPost]
        public async Task<bool> InsertPicture([FromServices]IHostingEnvironment environment)
        {
            var data = new PicData();
            string path = string.Empty;
            var files = Request.Form.Files;
            if (files == null || files.Count() <= 0) { data.Msg = "请选择上传的文件。"; return false; }
            //格式限制
            var allowType = new string[] { "image/jpg", "image/png","image/jpeg"};
            if (files.Any(c => allowType.Contains(c.ContentType)))
            {
                if (files.Sum(c => c.Length) <= 1024 * 1024 * 4)
                {
                    foreach (var file in files)
                    {
                        string strpath = Path.Combine("Upload", DateTime.Now.ToString("MMddHHmmss") + file.FileName);
                        path = Path.Combine(environment.WebRootPath, strpath);

                        using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                        {
                            await file.CopyToAsync(stream);
                        }
                    }
                    data.Msg = "上传成功";
                    return true;
                }
                else
                {
                    data.Msg = "图片过大";
                    return false;
                }
            }
            else

            {
                data.Msg = "图片格式错误";
                return false;
            }
        }

    }
    public class PicData
    {
        public string Msg { get; set; }
    }

代码解读:

读取wwwroot是在IHostingEnvironment对象中的,如果不通过依赖注入,就需要直接写成参数,那么file上传的参数开头都应该[FromServices]来修饰,在代码中判断了响应的文件格式、文件大小,通过file.copy就把文件保存在了服务器。

需要跨域:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddCors(options =>
            {
                options.AddPolicy("hehe", p => p.AllowAnyMethod()// 允许任何方法 GET,POST,PUT,DELETE, OPTIONS
                            .AllowAnyHeader()       // 允许任何请求头
                            .AllowAnyOrigin()       // 允许任何地址
                   );
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseStaticFiles(); app.UseCors("hehe");
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvc();
        }

前台:

<template>
    <div>
        <Upload
        multiple
        type="drag"
        action="http://localhost:54331/api/Index">
        <div style="padding: 20px 0">
            <Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
            <p>点击或将文件拖拽到这里上传</p>
        </div>
    </Upload>
    </div>
</template>
<script>
export default {

}
</script>

代码解读::

前台是非常简单的,在main.js中引用Iview,当然这一切的前提都需要Npm一下它.iview的这个组件,action就是你请求的方法,默认呢就是post请求。那么Iview还有别的属性,详见下方。
属性说明类型默认值
action上传的地址,必填String-
headers设置上传的请求头部Object{}
multiple是否支持多选文件Booleanfalse
data上传时附带的额外参数Object-
name上传的文件字段名Stringfile
with-credentials支持发送 cookie 凭证信息Booleanfalse
show-upload-list是否显示已上传文件列表Booleantrue
type上传控件的类型,可选值为 select(点击选择),drag(支持拖拽)Stringselect
accept接受上传的文件类型String-
format支持的文件类型,与 accept 不同的是,format 是识别文件的后缀名,accept 为 input 标签原生的 accept 属性,会在选择文件时过滤,可以两者结合使用Array[]
max-size文件大小限制,单位 kbNumber-

效果图:

文末:

后来我们团队考虑到使用七牛这个在线储存图片站点,准备好实名的账号和sdk,获取AccessKey,SecretKey。登录七牛管理后台->个人信息->秘钥管理

那么官方给我们提供了.net core 的版本直接nuget就可以了。

 

代码:

/// <summary>
         /// 实现将文件上传到七牛云
         /// </summary>
         /// <param name="stream">文件流</param>
         /// <param name="fileName">文件名称</param>
         /// <returns></returns>
         public UploadQiNiuResult UploadImgToQiNiu(byte[] stream, string fileName)
         {
             Mac mac = new Mac(BlogStatic.QiNiuInfo_AccessKey, BlogStatic.QiNiuInfo_SecretKey);
             // 上传策略,参见
             // https://developer.qiniu.com/kodo/manual/put-policy
             PutPolicy putPolicy = new PutPolicy();
             // 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
             // putPolicy.Scope = bucket + ":" + saveKey;
             var saveKey = string.Format("BlogImg/{0}/", DateTime.Now.ToString("yyyy/MM/dd")) + fileName;
             putPolicy.Scope = "blog:" + saveKey;
             // 上传策略有效期(对应于生成的凭证的有效期)
             putPolicy.SetExpires();
             // 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
             // putPolicy.DeleteAfterDays = 1;
             string jstr = putPolicy.ToJsonString();
             //获取上传凭证
             var uploadToken = Auth.CreateUploadToken(mac, jstr);
             UploadManager um = new UploadManager();
 
             HttpResult result = um.UploadData(stream, saveKey, uploadToken);
 
             )
             {
                 return JsonConvert.DeserializeObject<UploadQiNiuResult>(result.Text);
             }
             return null;
         }

UploadQiNiuResult类

public class UploadQiNiuResult
     {
         public string Hash { get; set; }
         public string Key { get; set; }
     }

转载于:https://www.cnblogs.com/ZaraNet/p/10212821.html

相关文章:

  • 三分钟教你同步 Visual Studio Code 设置
  • 《快速阅读术》
  • 容器中 Java 应用程序的内存和 CPU 如何分配?看这一篇就够了!
  • 北斗三号系列核心芯片
  • Hive日期函数笔记
  • 21-Python与设计模式--备忘录模式
  • mysql-connector-java 6版本的jdbc连接问题
  • Android FM模块学习之四源码解析(一)
  • 冲刺第四天 1.4 FRI
  • 有关java中static关键的重写问题
  • Tortoise SVN 创建分支与合并
  • Delphi 发送按键
  • Python - 默认参数的一次性求值
  • Internet TV 影音娱乐新生活
  • Linux 引导过程内幕
  • 【Linux系统编程】快速查找errno错误码信息
  • 07.Android之多媒体问题
  • Docker 笔记(2):Dockerfile
  • Github访问慢解决办法
  • Java多线程(4):使用线程池执行定时任务
  • Java精华积累:初学者都应该搞懂的问题
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Nacos系列:Nacos的Java SDK使用
  • python学习笔记 - ThreadLocal
  • React+TypeScript入门
  • vue的全局变量和全局拦截请求器
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于webpack 的 vue 多页架构
  • 通过npm或yarn自动生成vue组件
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • # Maven错误Error executing Maven
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $forceUpdate()函数
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (LeetCode 49)Anagrams
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)关于pipe()的详细解析
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET MVC第五章、模型绑定获取表单数据
  • .sh
  • @media screen 针对不同移动设备
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [CSS]CSS 的背景
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出