新增加上传文件到阿里云

This commit is contained in:
不做码农 2021-11-29 13:46:55 +08:00
parent 7eadff782e
commit 3c9e0a7569
8 changed files with 176 additions and 13 deletions

View File

@ -5,7 +5,9 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System;
using System.IO;
using System.Linq;
using ZR.Admin.WebApi.Filters;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers
{
@ -15,10 +17,12 @@ namespace ZR.Admin.WebApi.Controllers
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private OptionsSetting OptionsSetting;
private IWebHostEnvironment WebHostEnvironment;
public UploadController(IOptions<OptionsSetting> optionsSetting, IWebHostEnvironment webHostEnvironment)
private ISysFileService SysFileService;
public UploadController(IOptions<OptionsSetting> optionsSetting, IWebHostEnvironment webHostEnvironment, ISysFileService fileService)
{
OptionsSetting = optionsSetting.Value;
WebHostEnvironment = webHostEnvironment;
SysFileService = fileService;
}
/// <summary>
/// 存储文件
@ -26,8 +30,8 @@ namespace ZR.Admin.WebApi.Controllers
/// <param name="formFile"></param>
/// <returns></returns>
[HttpPost]
[Verify]
[ActionPermissionFilter(Permission = "system")]
//[Verify]
//[ActionPermissionFilter(Permission = "system")]
public IActionResult SaveFile([FromForm(Name = "file")] IFormFile formFile)
{
if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传图片不能为空");
@ -35,7 +39,7 @@ namespace ZR.Admin.WebApi.Controllers
string fileName = FileUtil.HashFileName(Guid.NewGuid().ToString()).ToLower() + fileExt;
string finalFilePath = Path.Combine(WebHostEnvironment.WebRootPath, FileUtil.GetdirPath("uploads"), fileName);
finalFilePath = finalFilePath.Replace("\\", "/").Replace("//", "/");
if (!Directory.Exists(Path.GetDirectoryName(finalFilePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(finalFilePath));
@ -47,7 +51,36 @@ namespace ZR.Admin.WebApi.Controllers
}
string accessPath = $"{OptionsSetting.Upload.UploadUrl}/{FileUtil.GetdirPath("uploads").Replace("\\", " /")}{fileName}";
return ToResponse(ResultCode.SUCCESS, new { accessPath, fullPath = finalFilePath });
return ToResponse(ResultCode.SUCCESS, accessPath);
}
/// <summary>
/// 存储文件到阿里云
/// </summary>
/// <param name="formFile"></param>
/// <returns></returns>
[HttpPost]
//[Verify]
//[ActionPermissionFilter(Permission = "system")]
public IActionResult SaveFileAliyun([FromForm(Name = "file")] IFormFile formFile)
{
if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空");
string fileExt = Path.GetExtension(formFile.FileName);
string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".jpeg", ".webp", ".svga", ".xls" };
int MaxContentLength = 1024 * 1024 * 4;
if (!AllowedFileExtensions.Contains(fileExt))
{
return ToResponse(ResultCode.CUSTOM_ERROR, "上传失败,未经允许上传类型");
}
if (formFile.Length > MaxContentLength)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + (MaxContentLength / 1024).ToString() + " MB");
}
(bool, string) result = SysFileService.SaveFile("", formFile);
return ToResponse(ResultCode.SUCCESS, result.Item2);
}
}
}

View File

@ -24,10 +24,13 @@
"UploadDirectory": "/",
"UploadUrl": "http://localhost:8888"
},
"QIQIU_OSS": {
//°¢ÀïÔÆ´æ´¢ÅäÖÃ
"ALIYUN_OSS": {
"REGIONID": "cn-hangzhou",
"KEY": "XX",
"SECRET": "XX"
"SECRET": "XX",
"bucketName": "bucketName",
"domainUrl": "http://xxx.xxx.com"//·ÃÎÊ×ÊÔ´ÓòÃû
},
"gen": {
"conn": "server=LAPTOP-STKF2M8H\\SQLEXPRESS;user=zr;pwd=abc;database=ZrAdmin;Trusted_Connection=SSPI",

View File

@ -98,7 +98,8 @@ namespace ZR.CodeGenerator
{
sb.AppendLine($" //文件上传成功方法");
sb.AppendLine($" handleUpload{dbFieldInfo.CsharpField}Success(res, file) {{");
sb.AppendLine($" this.form.{columnName} = URL.createObjectURL(file.raw);");
sb.AppendLine($" this.form.{columnName} = res.data;");
sb.AppendLine($" // this.form.{columnName} = URL.createObjectURL(file.raw);");
sb.AppendLine($" // this.$refs.upload.clearFiles();");
sb.AppendLine($" }},");
replaceDto.VueBeforeUpload = TplJsBeforeUpload();
@ -346,7 +347,7 @@ namespace ZR.CodeGenerator
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(@" //文件上传前判断方法");
sb.AppendLine(@" uploadUrl: process.env.VUE_APP_BASE_API + ""/upload/SaveFile/"",");
sb.AppendLine(@" uploadUrl: process.env.VUE_APP_BASE_API + ""upload/SaveFile"",");
return sb.ToString();
}

View File

@ -0,0 +1,47 @@
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Infrastructure;
using System;
using System.IO;
namespace ZR.Common
{
public class AliyunOssHelper
{
static string accessKeyId = ConfigUtils.Instance.GetConfig("ALIYUN_OSS:KEY");
static string accessKeySecret = ConfigUtils.Instance.GetConfig("ALIYUN_OSS:SECRET");
static string endpoint = ConfigUtils.Instance.GetConfig("ALIYUN_OSS:REGIONID");
static string bucketName1 = ConfigUtils.Instance.GetConfig("ALIYUN_OSS:bucketName");
/// <summary>
/// 上传到阿里云
/// </summary>
/// <param name="filestreams"></param>
/// <param name="dirPath">存储路径 eg upload/2020/01/01/xxx.png</param>
/// <param name="bucketName">存储桶 如果为空默认取配置文件</param>
public static System.Net.HttpStatusCode PutObjectFromFile(Stream filestreams, string dirPath, string bucketName = "")
{
OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);
if (string.IsNullOrEmpty(bucketName)) { bucketName = bucketName1; }
try
{
dirPath = dirPath.Replace("\\", "/");
PutObjectResult putObjectResult = client.PutObject(bucketName, dirPath, filestreams);
// Console.WriteLine("Put object:{0} succeeded", directory);
return putObjectResult.HttpStatusCode;
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
return System.Net.HttpStatusCode.BadRequest;
}
}
}

View File

@ -5,7 +5,12 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageReference Include="MailKit" Version="2.15.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
</ItemGroup>
</Project>

View File

@ -1,9 +1,24 @@
using Infrastructure.Attribute;
using ZR.Model.System;
using Microsoft.AspNetCore.Http;
namespace ZR.Service.System.IService
{
public interface ISysFileService
{
(bool, string) SaveFile(string picdir, IFormFile formFile);
/// <summary>
/// 按时间来创建文件夹
/// </summary>
/// <param name="path"></param>
/// <returns>eg: 2020/11/3</returns>
string GetdirPath(string path = "");
/// <summary>
/// 取文件名的MD5值(16位)
/// </summary>
/// <param name="name">文件名,不包括扩展名</param>
/// <returns></returns>
string HashFileName(string str = null);
}
}

View File

@ -1,6 +1,13 @@
using Infrastructure.Attribute;
using ZR.Model.System;
using Microsoft.AspNetCore.Http;
using System.IO;
using ZR.Service.System.IService;
using ZR.Common;
using Infrastructure;
using System;
using System.Text;
using System.Security.Cryptography;
using System.Net;
namespace ZR.Service.System
{
@ -10,6 +17,57 @@ namespace ZR.Service.System
[AppService(ServiceType = typeof(ISysFileService), ServiceLifetime = LifeTime.Transient)]
public class SysFileService : ISysFileService
{
private string domainUrl = ConfigUtils.Instance.GetConfig("ALIYUN_OSS:domainUrl");
/// <summary>
/// 上传文件到阿里云
/// </summary>
/// <param name="picdir"></param>
/// <param name="formFile"></param>
/// <returns></returns>
public (bool, string) SaveFile(string picdir, IFormFile formFile)
{
// eg: idcard/2020/08/18
string dir = GetdirPath(picdir.ToString());
string tempName = HashFileName();
string fileExt = Path.GetExtension(formFile.FileName);
string fileName = $"{tempName}{fileExt}";
string webUrl = $"{domainUrl}/{dir}/{fileName}";
HttpStatusCode statusCode = AliyunOssHelper.PutObjectFromFile(formFile.OpenReadStream(), Path.Combine(dir, fileName));
if (statusCode == HttpStatusCode.OK)
{
return (true, webUrl);
}
return (false, "");
}
public string GetdirPath(string path = "")
{
DateTime date = DateTime.Now;
int year = date.Year;
int month = date.Month;
int day = date.Day;
//int hour = date.Hour;
string timeDir = $"{year}/{month}/{day}";// date.ToString("yyyyMM/dd/HH/");
if (!string.IsNullOrEmpty(path))
{
timeDir = path + "/" + timeDir;
}
return timeDir;
}
public string HashFileName(string str = null)
{
if (string.IsNullOrEmpty(str))
{
str = Guid.NewGuid().ToString();
}
MD5CryptoServiceProvider md5 = new();
return BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(str)), 4, 8).Replace("-", "");
}
}
}

View File

@ -179,7 +179,7 @@ export default {
//
sexOptions: [],
//
uploadUrl: process.env.VUE_APP_BASE_API + "/upload/SaveFile/",
uploadUrl: process.env.VUE_APP_BASE_API + "upload/SaveFile",
//
dataList: [],
@ -291,7 +291,8 @@ export default {
},
//
handleUploadIconSuccess(res, file) {
this.form.icon = URL.createObjectURL(file.raw);
this.form.icon = res.data;
// this.form.icon = URL.createObjectURL(file.raw);
// this.$refs.upload.clearFiles();
},
//