初试“七牛云”--零基础运用七牛云配合UEditor实现图片的上传和浏览(.NET篇)

(注册和建立存储空间就不介绍了,网上一把一把的资料,自己试着点点也能明白)

作为一个成熟的菜鸟,如果遇到一个新问题,第一步当然是先百度一下。。。

看了N个关于七牛云的使用的帖子,表示还是蒙圈的,看懂了一部分,但是不系统,理解的不连贯,作为一个凡是要弄个特别明白的死脑筋,于是开始从头看是研究文档。。。。(以下都是来自http://developer.qiniu.com/article/index.html#quickstart,经过个人精简,如有不明,详情请参阅文档)

先弄明白原理,才能更好的看懂代码。

1.三个结构

a.七牛云存储服务

b.业务服务器

c.客户端-------客户端通常同时是资源的生产方和消费方。客户端在展示内容时,通常需要先从业务服务器获取资源的元信息,并得到必要的[下载凭证][downloadtokenHref],然后使用下载凭证从七牛云存储服务获取待展示的资源内容,从而实现一个完整的内容展示过程。

2.业务流程

  • 上传

    客户端在上传资源到七牛云存储之前要先从业务服务器获取一个有效的上传凭证,因此需要先后和两个服务端打交道。

上传凭证保存在上传策略( RS文件夹-PutPolicy.cs)(上传策略具体参数设置 http://developer.qiniu.com/article/developer/security/put-policy.html)

如果有设置回调,则上传完成时七牛云存储会自动发起回调到指定的业务服务器。

  • 下载

    公开资源不需要对应的下载凭证,客户端可以直接从七牛云存储下载对应资源。私有资源需要对应的下载凭证,因此必须先和业务服务器打交道。

    按照实际的使用场景,客户端对于内容的展示非常类似一个动态网页的生成过程,因此无论该页面内容是公开还是私有,均需要从业务服务器获取展示该页面的动态布局信息。所以通常显示过程也是需要先后和业务服务器及七牛云存储服务打交道。

于是乎,测试 官方的“简单上传”的代码(http://developer.qiniu.com/code/v6/sdk/csharp.html#io-put)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using Qiniu.Auth;
 7 using Qiniu.IO;
 8 using Qiniu.IO.Resumable;
 9 using Qiniu.RS;
10
11 namespace ConsoleDemo
12 {
13     class UploadDemo
14     {
15
16         private void upload()
17         {
18             //设置账号的AK和SK
19             Qiniu.Conf.Config.ACCESS_KEY = "Access_Key"; ①
20             Qiniu.Conf.Config.SECRET_KEY = "Secret_Key";②
21             IOClient target = new IOClient();
22             PutExtra extra = new PutExtra();
23             //设置上传的空间
24             String bucket = "bucket_name";③
25             //设置上传的文件的key值
26             String key = "yourdefinekey";//上传成功后的文件名(可以和上传文件不是同一个名字) ④
27
28             //普通上传,只需要设置上传的空间名就可以了,第二个参数可以设定token过期时间
29             PutPolicy put = new PutPolicy(bucket, 3600);
30
31             //调用Token()方法生成上传的Token
32             string upToken = put.Token();
33             //上传文件的路径
34             String filePath = "/.../...";⑤
35
36             //调用PutFile()方法上传
37             PutRet ret = target.PutFile(upToken, key, filePath, extra);
38             //打印出相应的信息
39             Console.WriteLine(ret.Response.ToString());
40             Console.WriteLine(ret.key);
41             Console.ReadLine();
42         }
43
44         static void Main(string[] args)
45         {
46             //实例化UploadDemo对象并调用设置的upload方法
47             UploadDemo Upload = new UploadDemo();
48             Upload.upload();
49         }
50     }
51 }

以上5处需要修改为自己的内容

看了半天都是蒙圈,最后感觉其实上传的过程就是两步、两步、两步!!!!

1.生成TOKEN(上传凭证upload-token,详情见http://developer.qiniu.com/article/developer/security/upload-token.html)

构造上传策略1json化=>2URL安全的Base64编码=>3使用SecretKey计算HMAC-SHA1签名=>4再进行一次URL安全的Base64编码=>

5最终拼接成uploadToken=>

总结,②是用于加密上传策略的,①③是构造上传策略,①②③一起生成token,④⑤和token一起作为PutFile()方法的上传参数。

具体到程序中,

Mac就是计算“七牛认证”的类(包括计算方法,让Token方法调用)

Mac的sign方法实现了上面第三步的“SecretKey计算HMAC-SHA1签名”&第四步

Mac的SignWithData调用了sign并实现上面第五步,拼接形成最后的上传凭证(token)

2.调用“ IOClient”的“PutFile()”方法上传

特别注意:如果注册空间的时候,选择了“华北”,那么需要增加一行代码,否则怎么上传都不成功。。。。

1 Qiniu.Conf.Config.UP_HOST = "http://up-z1.qiniu.com";

开个控制台,调用UploadDemo.upload

1 UploadDemo Upload = new UploadDemo();
2  Upload.upload();

查看空间里有没有这个文件(空间-内容管理),如果有就说明“简单上传”测试成功了。



接下来,就是搞定ueditor中上传图片到七牛云。

由于ueditor使用的是流,所以只需要把PutFile方法改为使用Put方法,(IOClient中有个Put方法可以使用流,如下)

      public PutRet Put(string upToken, string key, System.IO.Stream putStream, PutExtra extra)
        {
            if (!putStream.CanRead)
            {
                throw new Exception("read put Stream error");
            }
            PutRet ret;
            NameValueCollection formData = getFormData(upToken, key, extra);
            try
            {
                CallRet callRet = MultiPart.MultiPost(Config.UP_HOST, formData, putStream);
                ret = new PutRet(callRet);
                onPutFinished(ret);
                return ret;
            }
            catch (Exception e)
            {
                ret = new PutRet(new CallRet(HttpStatusCode.BadRequest, e));
                onPutFinished(ret);
                return ret;
            }
        }

代码改为:

using Qiniu.IO;
using Qiniu.RS;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace qiniu
{

       public class UploadDemo
        {

            public void upload()
            {

                Qiniu.Conf.Config.ACCESS_KEY = "";
                Qiniu.Conf.Config.SECRET_KEY = "";
                Qiniu.Conf.Config.UP_HOST = "http://up-z1.qiniu.com";
                IOClient target = new IOClient();
                PutExtra extra = new PutExtra();
                //设置上传的空间
                String bucket = "";      //设置上传的文件的key值
                String key = "222.jpg";

                //普通上传,只需要设置上传的空间名就可以了,第二个参数可以设定token过期时间
                PutPolicy put = new PutPolicy(bucket, 3600);//调用Token()方法生成上传的Token
                string upToken = put.Token();
                //上传文件的路径
                String filePath = @"E:\chaye.jpg";
                FileStream fs=new FileStream (filePath,FileMode.Open,FileAccess.Read);

                //调用PutFile()方法上传
               // PutRet ret = target.PutFile(upToken, key, filePath, extra);
                PutRet ret=target.Put(upToken,key,fs,extra);
                //打印出相应的信息
                Console.WriteLine(ret.Response.ToString());
                Console.WriteLine(ret.key);
                Console.ReadLine();
            }

    }
}

既然方法试验成功,最后就是结合ueditor,改造代码

ueditor的IOClient.cs的Put方法添加

UploadHandler.cs中改造Process方法

  1  public override void Process()
  2     {
  3         byte[] uploadFileBytes = null;
  4         string uploadFileName = null;
  5
  6         if (UploadConfig.Base64)
  7         {
  8             uploadFileName = UploadConfig.Base64Filename;
  9             uploadFileBytes = Convert.FromBase64String(Request[UploadConfig.UploadFieldName]);
 10         }
 11         else
 12         {
 13             var file = Request.Files[UploadConfig.UploadFieldName];
 14             uploadFileName = file.FileName;
 15             if (!CheckFileType(uploadFileName))
 16             {
 17                 Result.State = UploadState.TypeNotAllow;
 18                 WriteResult();
 19                 return;
 20             }
 21             if (!CheckFileSize(file.ContentLength))
 22             {
 23                 Result.State = UploadState.SizeLimitExceed;
 24                 WriteResult();
 25                 return;
 26             }
 27
 28             uploadFileBytes = new byte[file.ContentLength];
 29             try
 30             {
 31                 file.InputStream.Read(uploadFileBytes, 0, file.ContentLength);
 32             }
 33             catch (Exception)
 34             {
 35                 Result.State = UploadState.NetworkError;
 36                 WriteResult();
 37             }
 38         }
 39
 40         Result.OriginFileName = uploadFileName;
 41
 42         //上传到七牛云
 43         44         string qiNiuFileName=CommonHelper.CalcMD5(uploadFileBytes)+Path.GetExtension(uploadFileName);        //自己封装了一个MD5的方法,随意,可以不加,这里就是为了尽量避免重名
 45
 49         var savePath = PathFormatter.Format(uploadFileName, UploadConfig.PathFormat);
 50         var localPath = Server.MapPath(savePath);
 51         try
 52         {
 53             Qiniu.Conf.Config.ACCESS_KEY = "";
 54             Qiniu.Conf.Config.SECRET_KEY = "";
 55             Qiniu.Conf.Config.UP_HOST = "";
 56             IOClient target = new IOClient();
 57             PutExtra extra = new PutExtra();
 58             //设置上传的空间
 59             String bucket = "";
 60             //设置上传的文件的key值
 61             String key = qiNiuFileName;//1
 62
 63             //普通上传,只需要设置上传的空间名就可以了,第二个参数可以设定token过期时间
 64             PutPolicy put = new PutPolicy(bucket, 3600);
 65              66
 67             //调用Token()方法生成上传的Token
 68             string upToken = put.Token();
 69             //上传文件的路径
 70             MemoryStream ms = new MemoryStream(uploadFileBytes);
 71
 72             //调用PutFile()方法上传
 73             // PutRet ret = target.PutFile(upToken, key, filePath, extra);
 74             PutRet ret = target.Put(upToken, key,ms, extra);
 75
 76             Result.Url = "外链默认域名" + qiNiuFileName;
 77
 78             Result.State = UploadState.Success;
 79
 80             //PutPolicy policy = new PutPolicy(bucket, 3600);
 81             //string upToken = policy.Token();
 82             //Settings setting = new Settings();
 83             //ResumablePutExtra extra = new ResumablePutExtra();
 84             //ResumablePut client = new ResumablePut(setting, extra);
 85             //CallRet callRet = client.PutFile(upToken, new byte[0] { }, "");
 86             //if (callRet.OK)
 87             //{
 88
 89             //}
 90
 91         }
 92         catch (Exception e)
 93         {
 94             Result.State = UploadState.FileAccessError;
 95             Result.ErrorMessage = e.Message;
 96         }
 97         finally
 98         {
 99             WriteResult();
100         }
101     }

参考https://segmentfault.com/a/1190000002462516

注意:导致浏览器访问的时候(编译并不报错),显示 “文件访问出错,检查权限”,F12看上传后response报文,未找到newtonjson 4.5.0.0。

原因:因为之前手动添加过Newtonsoft.Json.dll(4.5.0.0),跟ueditor-net- Bin目录的newtonJson版本 不一致(9.0.0.0)。

解决方法:在web.config的<configuration>节点下添加,只需要添加一次,之后删除都可以。

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                <bindingRedirect oldVersion="4.5.0.0-6.0.0.0" newVersion="9.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
</runtime>

猜想,关于newtonJSON版本的问题,都可以通过上面代码解决。

时间: 2024-08-05 22:12:52

初试“七牛云”--零基础运用七牛云配合UEditor实现图片的上传和浏览(.NET篇)的相关文章

如何利用”七牛云”在UEditor实现图片的上传和浏览

在学习之前,我参考了朋友些的一篇关于这个功能实现的文章,非常不错.大家可以参考:http://www.cnblogs.com/John-Marnoon/p/5818528.html#3501846 里面都写了具体的实现,我也是参照朋友的文章来操作的.现在我重新整理一下实现的步骤: 1 . 注册一个七牛云用户 2.  在七牛云网站中创建一个空间来存储图片,存储区域选择 华东或是 华北,请先记得上传到华东1区的域名为up.qiniu.com.up-z0.qiniu.com和upload.qiniu.

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4

PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例

网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了.研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向. 首先本篇文章实现的功能如下: 1.利用表单上传功能,用户可以点击选择文件按钮,选择本地的一个文件,同时设定上传的图片的名称,点击上传按钮可以上传并存储到七牛云存储. 2.在点击上传时会检测文件的后缀名,限制为jpg和png格式存储. 3.上传成功后跳转到自己设定的一个URL,并传回文件信息,如文件名.而不是显示七牛白花花的json显示页面. 好啦,那我们开始吧

Laravel项目中使用markdown编辑器及图片粘贴上传七牛云

本文为转载,原文:http://www.chairis.cn/blog/article/15 Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.本次我们选用的编辑器是: Editor.md,官网中也有很详细的介绍.从官网中下载安装下载的内容中,也有很多demo可以借鉴.在下载的包中,去除一些多余的内容,只保留我们需要的内容,然后加到项目的public目录下,如下图红色框内的内容: 项目中使用 在项目中使用edit

Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传

[前言] 之前研究了ueditor直接上传图片文件到七牛云以及百度云存储,见下面两篇文章: http://uikoo9.com/blog/detail/ueditor-for-bcs http://uikoo9.com/blog/detail/ueditor-for-qiniu 另外还有一篇ueditor-1.4.3-jsp的使用教程: http://uikoo9.com/blog/detail/how-to-use-ueditor 今天实现了ueditor可配置选择上传到七牛还是百度还是本地,

框架基础:ajax设计方案(三)---集成ajax上传技术

之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的level2的改进就不介绍了,不清楚的可到前几篇博客去看看.我们直接切入主题. 概念介绍: 1. js的FormData:js中在新的版本中已经支持了FormData对象,可以初始化一个空的form,或者初始化已经存在的form,浏览器测试代码. 2. 浏览器的支持:浏览器已支持input=file的

Android基础之——startActivityForResult启动界面并返回数据,上传头像

在android应用的开发过程中,经常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在很多应用程序的模块中,都有"我的"这个模块,在未登录状态下点击其中的某一项,就会弹出登录界面,登录完成后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult. 下面通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用. demo的效果图如下: 主界面布局:

java开发:分享一下百度ueditor和七牛的图片集成上传

做网站时,如果上传的图片量很大,现在不少人会选用七牛图片服务器.那么,今天就来说说如何把网站的图片上传与七牛的sdk集成的问题. jsp页面,实现图片上传的方式也很多,今天就来说下百度的编辑器:ueditor 首先要到官网去下载它,后面我也会附上源代码,需要的朋友可以下载. 我们新建一个项目:qndemo,然后将ueditor放到webroot目录下,截图如下: 另外,我们还要引入jar包: 前台页面,我们需要引用相关js,默认配置下,会加载出编辑效果,如下图: 这时候,我们上传的图片会保存在本

Android零基础入门第49节:AdapterViewFlipper图片轮播

上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilpper的使用. 一.认识AdapterViewFilpper AdapterViewFilpper 继承 了AdapterViewAnimator,它也会显示 Adapter 提供的多个 View 组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个.下一个组件. AdapterViewFilpper可以在多个V