首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

七牛云存储开发图片上传功能

1、注册登录七牛云,并实名认证,对象存储控制台,新增bucket存储空间 2、nodejs服务器安装npm install qiniu --save const common = require('../../lib/common.js') const qiniu = require('qiniu') let niu = {} niu.errorHandler = common.errorHandler niu.createToken = function(req, res, next) { let result = req.body.result var accessKey = common.config.qiniuAccessKey var secretKey = common.config.qiniuSecretKey var mac = new qiniu.auth.digest.Mac(accessKey, secretKey) var options = { scope: 'images', // 创建好的bucket expires: 3600 // 过期时间 单位s } var putPolicy = new qiniu.rs.PutPolicy(options) var uploadToken=putPolicy.uploadToken(mac) result.qiniu = uploadToken return common.send(req, res, {status: 0, msg: '登录成功!', data: result}) } module.exports = niu 通过以上方法生产客户端上传图片需要用的token 3、客户端安装npm install qiniu-js --save confirm() { let formData = new FormData(this.$refs.form.$el) let file = formData.get('file') let key = file.name let putExtra = { mimeType: ['image/png', 'image/jpeg'] || null // 前端校验图片格式 } console.log(file) var observable = qiniu.upload(file, key, this.token, putExtra) var observer = { next(res) { console.log(res) }, error(err) { console.log(err) }, complete(res) { console.log(res) } } var subscription = observable.subscribe(observer) // 上传开始 console.log(subscription) // // or // var subscription = observable.subscribe(next, error, complete) // 这样传参形式也可以 // subscription.unsubscribe() // 上传取消 } observer的参数注释 next: 接收上传进度信息,res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性,提供上传进度信息。 total.loaded: number,已上传大小,单位为字节。 total.total: number,本次上传的总量控制信息,单位为字节,注意这里的 total 跟文件大小并不一致。 total.percent: number,当前上传进度,范围:0~100。 error: 上传错误后触发,当不是 xhr 请求错误时,会把当前错误产生原因直接抛出,诸如 JSON 解析异常等;当产生 xhr 请求错误时,参数 err 为一个包含 code、message、isRequestError 三个属性的 object: err.isRequestError: 用于区分是否 xhr 请求错误;当 xhr 请求出现错误并且后端通过 HTTP 状态码返回了错误信息时,该参数为 true;否则为 undefined 。 err.reqId: string,xhr请求错误的 X-Reqid。 err.code: number,请求错误状态码,只有在 err.isRequestError 为 true 的时候才有效,可查阅码值对应说明。 err.message: string,错误信息,包含错误码,当后端返回提示信息时也会有相应的错误信息。 complete: 接收上传完成后的后端返回信息,res 参数为一个 object, 为上传成功后后端返回的信息,具体返回结构取决于后端sdk的配置,

优秀的个人博客,低调大师

C#开发中使用委托的作用和好处

先看概念,什么是委托? 从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针” 通俗的说就是:通过委托,我们可以把方法当成参数传递。 这里我举个例子:“设想,如果我们写了一个厨师做菜的方法,里面有拿菜、切菜、配菜、炒菜四个步骤,但编写此方法代码的人想让配菜这个环节让调用方法的人来实现,换句话说,就是想把方法作为参数来传递,那么怎么来实现呢? 方法1:使用接口,这里不是我们讨论的。 方法2:使用委托、微软为我们提供了一个叫做委托的类型,委托允许我们把一个方法当成参数传递。委托的定义 就上面的例子,拿菜、切菜、配菜、炒菜我们定义4个方法,抽象成一个做菜类(ZuoCai.cs)。 public class ZuoCai { //定义一个做菜的委托 public delegate void ZuoCaiDelegate(); /// 拿菜方法 public void NaCai() { Console.WriteLine("A负责拿菜!"); } /// 切菜方法 public void QieCai() { Console.WriteLine("B负责切菜!"); } /// 配菜方法 public void PeiCai() { Console.WriteLine("C负责配菜!"); } /// 炒菜方法 public void ChaoCai() { Console.WriteLine($"D负责炒菜!"); } /// 开始做菜的方法 /// <param name="zuoCaiDelegate">委托作为参数传递</param> public void StartZuoCai(ZuoCaiDelegate zuoCaiDelegate) { zuoCaiDelegate(); } } 委托通过关键词delegate来定义,如下: //定义一个做菜的委托 public delegate void ZuoCaiDelegate(int number); 当然在c#4.0后,微软为我们简化了委托的定义,帮我们定义了Action和Func两种委托类型,但是原理都是通过delegate来实现,这里不跑题,有兴趣的关注我的其他章节。 定义了委托后,如何使用委托呢,委托要使用,必须实例化,如下: //实例化一个做菜类 ZuoCai zuoCai = new ZuoCai(); //实例化一个做菜的委托 ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai); //把多个方法绑定到委托上。 zuoCaiDelegate += zuoCai.QieCai; zuoCaiDelegate += zuoCai.PeiCai; zuoCaiDelegate += zuoCai.ChaoCai; 委托可以绑定多个方法,支持+=(添加方法)和-=(取消方法),上面的定义就是将做菜的4个方法按顺序绑定在委托上,执行时候也是按顺序执行。委托的使用 今天开店后,接了一个客户,然后店长安排做菜,如下。 public void Main() { //实例化一个做菜类 ZuoCai zuoCai = new ZuoCai(); //实例化一个做菜的委托 ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai); zuoCaiDelegate += zuoCai.QieCai; zuoCaiDelegate += zuoCai.PeiCai; zuoCaiDelegate += zuoCai.ChaoCai; //开始做菜 zuoCai.StartZuoCai(zuoCaiDelegate); } 运行后结果如下: 忽然来了一个湖南的湘妹子客户,要求配菜时候多放点辣椒,怎么办呢? 方法1:店长要求改写ZuoCai类中的PeiCai方法。 如果又来了一个广东的客户,要求放点糖,难道又要改方法吗?如果很多各种各样需求的用户,都要靠改动原有的方法来实现,这个显然不合理的,违法了设计模式中的开闭原则。 方法2:店长要求在调用地方重新添加一个配菜方法(对扩展开放),这个是合理的建议,如下: /// 配菜方法,加辣 void PeiCaiJiaLa() { Console.WriteLine("C负责配菜,要求多方点辣椒!"); } 只需要把调用方的 zuoCaiDelegate += zuoCai.PeiCai; 改为 zuoCaiDelegate += PeiCaiJiaLa; 完整代码如下: //实例化一个做菜类 ZuoCai zuoCai = new ZuoCai(); //实例化一个做菜的委托 ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai); zuoCaiDelegate += zuoCai.QieCai; zuoCaiDelegate += PeiCaiJiaLa; //改为新定义的方法 zuoCaiDelegate += zuoCai.ChaoCai; //开始做菜 zuoCai.StartZuoCai(zuoCaiDelegate); 运行结果如下: 上面的例子很清晰的演示了方法如何作为参数传递给另外一个方法,希望对大家有帮助。 欢迎大家转发,如需要了解更多前端和后端的编程技巧,可以关注我后续的文章

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册