如何解决将最大400MB的文件上传到ASP.NET Core 3.1
我正在使用ASP.NET Core 3.1,这是我从客户端上传文件(视频)的代码。我的问题是,最多10MB的上传花费了太多时间。是否可以通过流或其他任何最佳做法进行上传?
我所需的文件大小最大为400MB。
/// <response code="200">If all working fine</response>
/// <response code="403">If client made some mistake</response>
/// <response code="500">If Server Error</response>
[ProducesResponseType(200)]
[ProducesResponseType(403)]
[ProducesResponseType(500)]
[ProducesResponseType(typeof(Response<List<FileUrlResponce>>),200)]
[ProducesResponseType(typeof(Response<List<FileUrlResponce>>),403)]
[CustomAuthorize(false)]
[HttpPost]
[Route("uploadmedias3")]
public async Task<IActionResult> UploadMediaS3([FromForm]UploadDocuments param,IFormFile mediaFile)
{
try
{
var response = new List<FileUrlResponce>();
FileUrlResponce vedioFile = new FileUrlResponce();
var fileName = mediaFile.FileName;
if (param.Type == (int)EDocumentType.Image)
{
var file = await new SaveFiles().SendMyFileToS3(mediaFile,configuration.GetValue<string>("Amazon:Bucket"),"ProfilePicture",false,configuration.GetValue<string>("Amazon:AccessKey"),configuration.GetValue<string>("Amazon:AccessSecret"),configuration.GetValue<string>("Amazon:BaseUrl"));
if (!string.IsNullOrEmpty(file.URL))
{
file.URL = file.URL;
response.Add(file);
}
}
else if (param.Type == (int)EDocumentType.Video)
{
vedioFile = await new SaveFiles().SendMyFileToS3(mediaFile,true,configuration.GetValue<string>("Amazon:BaseUrl"));
if (!string.IsNullOrEmpty(vedioFile.URL) && !string.IsNullOrEmpty(vedioFile.ThumbUrl))
{
response.Add(vedioFile);
}
}
else if (param.Type == (int)EDocumentType.Document)
{
var file = await new SaveFiles().SendMyFileToS3(mediaFile,configuration.GetValue<string>("Amazon:BaseUrl"));
if (!string.IsNullOrEmpty(file.URL))
{
file.URL = file.URL;
response.Add(file);
}
}
if (response.Any())
{
return StatusCode(StatusCodes.Status200OK,new Response<List<FileUrlResponce>>() { isError = false,messages = "",data = response });
}
else
{
return StatusCode(StatusCodes.Status403Forbidden,new Response<List<FileUrlResponce>>() { isError = true,messages = Error.FileNotFound,data = new List<FileUrlResponce>() });
}
}
catch (Exception ex)
{
throw ex;
}
}
SaveFile()。SendMyFileToS3()=>方法代码总时间在服务器上载,然后s3是2-3分钟,84MB,宽带速度为10MB / s
public async Task<FileUrlResponce> SendMyFileToS3(IFormFile file,string bucketName,string subDirectoryInBucket,bool isVedio,string accessKey,string accessSecret,string baseUrl)
{
try
{
FileUrlResponce reponse = new FileUrlResponce();
var FileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_" + Guid.NewGuid().ToString("N") + Path.GetExtension(file.FileName);
using (var source = file.OpenReadStream())
{
source.Position = 0; Stream thumbStream = new MemoryStream(); source.CopyTo(thumbStream); var client = new AmazonS3Client(accessKey,accessSecret,RegionEndpoint.USEast1); PutObjectRequest putRequest = new PutObjectRequest
{
BucketName = bucketName,Key = subDirectoryInBucket + "/" + FileName,InputStream = source,ContentType = file.ContentType,CannedACL = S3CannedACL.PublicRead
}; PutObjectResponse response = await client.PutObjectAsync(putRequest);
reponse.URL = baseUrl + putRequest.Key;
if (!isVedio)
{
thumbStream.Seek(0,SeekOrigin.Begin);
thumbStream.Position = 0;
Bitmap srcBmp = new Bitmap(thumbStream);
float ratio = 1;
float minSize = Math.Min(256,256);
if (srcBmp.PropertyIdList.Contains(0x112)) //0x112 = Orientation
{
var prop = srcBmp.GetPropertyItem(0x112);
if (prop.Type == 3 && prop.Len == 2)
{
UInt16 orientationExif = BitConverter.ToUInt16(srcBmp.GetPropertyItem(0x112).Value,0);
if (orientationExif == 8)
{
srcBmp.RotateFlip(RotateFlipType.Rotate270FlipNone);
}
else if (orientationExif == 3)
{
srcBmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
}
else if (orientationExif == 6)
{
srcBmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
}
}
if (srcBmp.Width > srcBmp.Height)
{
ratio = minSize / (float)srcBmp.Width;
}
else
{
ratio = minSize / (float)srcBmp.Height;
}
SizeF newSize = new SizeF(srcBmp.Width * ratio,srcBmp.Height * ratio);
Bitmap target = new Bitmap((int)newSize.Width,(int)newSize.Height);
Stream saveableThumbStream = new MemoryStream();
using (Graphics graphics = Graphics.FromImage(target))
{
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(srcBmp,newSize.Width,newSize.Height);
graphics.Dispose();
target.Save(saveableThumbStream,ImageFormat.Jpeg);
}
PutObjectRequest putRequestThumb = new PutObjectRequest
{
BucketName = bucketName,Key = subDirectoryInBucket + "/thumb_" + FileName,InputStream = saveableThumbStream,CannedACL = S3CannedACL.PublicRead
};
PutObjectResponse responseThumb = await client.PutObjectAsync(putRequestThumb);
reponse.ThumbUrl = baseUrl + putRequestThumb.Key;
}
else
{
reponse.ThumbUrl = baseUrl + putRequest.Key;
}
}
return reponse;
}
catch (Exception ex) { throw ex; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。