本文主要将图片上传到七牛云上,废话不多说直接上代码
1.下载安装七牛云的包
2.创建七牛云返回数据实体
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GenernalMVC.Common.Upload
{
public class QiniuModel
{
public string key { get; set; }
public string hash { get; set; }
public string fsiz { get; set; }
public string bucket { get; set; }
public string name { get; set; }
}
}
3.创建上传工具类
using Qiniu.Http;
using Qiniu.Storage;
using Qiniu.Util;
using System;
using System.Configuration;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using System.Web;
namespace GenernalMVC.Common.Upload
{
/*==================================================================
* 类名 : 上传图片工具类
* 功能 : 上传图片到七牛云
* 作者 : 刘江林
* 日期 : 20220706
* 修改记录:
/*==================================================================*/
public class UploadImage
{
string AccessKey = ConfigurationManager.AppSettings["AccessKey"].ToString();
string SecretKey = ConfigurationManager.AppSettings["SecretKey"].ToString();
string QiniuAddress = ConfigurationManager.AppSettings["QiniuAddress"].ToString();
string bucket = "xdjofficial";//这个是我们在七牛云上创建的“存储空间”名称
/*****************************************************************************
* @function name : 通过文件流上传的七牛云,不存本地
* @author : 刘江林
* @date : 20220706
* @inparam : 文件流
* @outparam : 输出
* @last change : 最后修改时间
*****************************************************************************/
public async Task<string> Upload(HttpPostedFileBase file)
{
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_fffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
string saveKey = "xdjmvc/" + newFileName;
//string saveKey = "xdjmvc/" + file.FileName; //这个myfile 相当于一个文件夹,是我们只设定的。2.png是我们上传文件的文件名,上传成功后通过它来读
Mac mac = new Mac(AccessKey, SecretKey); // 生成(上传)凭证时需要使用此Mac
PutPolicy putPolicy = new PutPolicy();
// 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
// putPolicy.Scope = bucket + ":" + saveKey;
putPolicy.Scope = bucket;
// 上传策略有效期(对应于生成的凭证的有效期)
putPolicy.SetExpires(3600);
// 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
//putPolicy.DeleteAfterDays = 1;
putPolicy.ReturnBody = "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"fsiz\":$(fsize),\"bucket\":\"$(bucket)\",\"name\":\"$(x:name)\"}";
// 生成上传凭证
string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());//token生成
FormUploader target = new FormUploader(new Config() { Zone = Zone.ZoneCnSouth, UseHttps = true, UseCdnDomains = true, MaxRetryTimes = 3 });
BucketManager bucketManager = new BucketManager(mac, new Config() { Zone = Zone.ZoneCnSouth, UseHttps = true, UseCdnDomains = true, MaxRetryTimes = 3 });
await bucketManager.Delete(bucket, saveKey);
HttpResult result = await target.UploadStream(file.InputStream, saveKey, token,new PutExtra());
QiniuModel model = new QiniuModel();
if (result.Code==200)
{
model = result.Text.ToObject<QiniuModel>();
}
return QiniuAddress + "/"+model.key;
}
/*****************************************************************************
* @function name : 删除七牛云里的图片
* @author : 刘江林
* @date : 20220707
* @inparam : 文件地址 注:这里是七牛云存的地址
* @outparam : 输出返回编码
* @last change : 最后修改时间
*****************************************************************************/
public async Task<int> Delete(string filePath)
{
string[] sArray = filePath.Split(new string[] { QiniuAddress+"/" }, StringSplitOptions.RemoveEmptyEntries);
BucketManager bucketManager = new BucketManager(new Mac(AccessKey, SecretKey), new Config());
HttpResult result = await bucketManager.Delete(bucket, sArray[0]);
return result.Code;
}
/*****************************************************************************
* @function name : 通过本地地址上传七牛云,存本地
* @author : 刘江林
* @date : 20220706
* @inparam : 文件流 图片本地地址
* @outparam : 文件在七牛云的地址
* @last change : 最后修改时间
*****************************************************************************/
public async Task<string> Upload(HttpPostedFileBase file,string url)
{
string saveKey = "MyFile/" + file.FileName;
Mac mac = new Mac(AccessKey, SecretKey);
string localFile = url;
PutPolicy putPolicy = new PutPolicy();
// 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
// putPolicy.Scope = bucket + ":" + saveKey;
putPolicy.Scope = bucket;
// 上传策略有效期(对应于生成的凭证的有效期)
putPolicy.SetExpires(3600);
// 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
//putPolicy.DeleteAfterDays = 1;
putPolicy.ReturnBody = "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"fsiz\":$(fsize),\"bucket\":\"$(bucket)\",\"name\":\"$(x:name)\"}";
// 生成上传凭证
string jstr = putPolicy.ToJsonString();
string token = Auth.CreateUploadToken(mac, jstr);
//Config配置类中可以配置区域,比如在我在七牛云上创建的fanin这个存储空间的区域选择的是“华南”这里就将它设为Zone=Zone.ZONE_CN_South
//UseHttps表示:是否采用https域名
//UseCdnDomains表示:上传是否使用CDN上传加速
//MaxRetryTimes表示:重试请求次数
UploadManager um = new UploadManager(new Config() { Zone = Zone.ZoneCnSouth, UseHttps = true, UseCdnDomains = true, MaxRetryTimes = 3 });
HttpResult result = await um.UploadFile(localFile, saveKey, token, new PutExtra());
QiniuModel model = new QiniuModel();
if (result.Code == 200)
{
model = result.Text.ToObject<QiniuModel>();
}
return QiniuAddress + "/" + model.key;
}
/*****************************************************************************
* @function name : 上传到服务器本地
* @author : 刘江林
* @date : 20220706
* @inparam : 文件流,图片存到哪个文件夹
* @outparam : 输出
* @last change : 最后修改时间
*****************************************************************************/
public string LocalImage(HttpPostedFileBase files,string url)
{
MemoryStream target = new MemoryStream();
files.InputStream.CopyTo(target);
byte[] data1 = target.ToArray();
if (files == null)
{//判断是否空提交
}
string fileName = files.FileName;//文件名
//获取文件名的后缀,并转为小写
string extension = Path.GetExtension(fileName).ToLower();
if (extension.Equals("jpg") || extension.Equals("png"))
{
}
//string name = System.Guid.NewGuid().ToString("N");//32位随机数字作为新文件名
string serverPath = url;
//string saveUrl = serverPath + name + extension;//文件存储路径+新文件名+后缀
string saveUrl = serverPath + fileName;
files.SaveAs(saveUrl);//保存图片
return saveUrl;
}
}
}
注意:
string AccessKey = ConfigurationManager.AppSettings["AccessKey"].ToString();-->这里是七牛云的AccessKey
string SecretKey = ConfigurationManager.AppSettings["SecretKey"].ToString();-->这里是七牛云的SecretKey
string QiniuAddress = ConfigurationManager.AppSettings["QiniuAddress"].ToString();-->这里是七牛云存储空间域名
string bucket = "xdjofficial";//这个是我们在七牛云上创建的“存储空间”名称
4.控制器里使用
/*****************************************************************************
* @function name : 上传新闻图片
* @author : 刘江林
* @date : 20220706
* @inparam : 文件流
* @outparam : 输出
* @last change : 最后修改时间
*****************************************************************************/
[HttpPost]
public async Task<JsonResult> UploadImage(HttpPostedFileBase files)
{
#region 通过本地上传
//string url= Server.MapPath("/Areas/ContentMnagement/Image/");//服务器图片存储位置
//UploadImage upload = new UploadImage();
//string saveurl = upload.LocalImage(files, url);
#endregion
UploadImage upload = new UploadImage();
string url = await upload.Upload(files);
var result = new { code = 200, msg = "上传成功", data = url.ToString() };
return Json(result, JsonRequestBehavior.AllowGet);
}
/*****************************************************************************
* @function name : layui上传图片接口
* @author : 刘江林
* @date : 20220707
* @inparam : 输入
* @outparam : 输出
* @last change : 最后修改时间
*****************************************************************************/
[HttpPost]
public async Task<JsonResult> LayuiUploadImage()
{
UploadImage upload = new UploadImage();
string url = await upload.Upload(HttpContext.Request.Files[0]);
var result = "{\"code\": 0,\"msg\": \"成功\",\"data\": {\"src\": \""+url+"\",\"title\": \"" + HttpContext.Request.Files[0].FileName +"\"}}";
return Json(result, JsonRequestBehavior.AllowGet);
}
5.实操
在七牛云上查看
至此图片就上传成功了,刚开始我也走了许多弯路,希望能给初学者提供帮助,谢谢观看!