NetCore 3.0文件上传和大文件上传的限制详解_实用技巧

来源:脚本之家  责任编辑:小易  

表单的Form标签中一定要添加 enctype=”multipart/form-data”文件才能上传。因为表单提交到当前模块的upload操作方法,所以我们在模块类里面添加下面的upload方法即可:Public function upload(){import('ORG.Net.UploadFile');upload=new UploadFile();upload->maxSize=3145728;upload->allowExts=array('jpg','gif','png','jpeg');upload->savePath='./Public/Uploads/';if!upload->upload()){/上传错误提示错误信息this->error($upload->getErrorMsg());}else{/上传成功 获取上传文件信息info=$upload->getUploadFileInfo();}保存表单数据 包括附件数据User=M("User");实例化User对象User->create();User->photo=$info[0]['savename'];User->add();this->success('数据保存成功!');}更多问题到后盾网论坛问题求助专区http://bbs.houdunwang.comwww.zgxue.com防采集请勿采集本网。

NetCore文件上传两种方式

1.是否可以正常上网。检查网络连接。2.可能是因为浏览器的问题。换一个浏览器试试。3.文件是否过大。在文件上右键,查看文件大小。

  NetCore官方给出的两种文件上传方式分别为“缓冲”、“流式”。我简单的说说两种的区别,

twrp一般都是默认挂在mtp模式的。直接链接电脑就行了。个别的需要用twrp的挂在和储存选项里面的挂在模式

  1.缓冲:通过模型绑定先把整个文件保存到内存,然后我们通过IFormFile得到stream,优点是效率高,缺点对内存要求大。文件不宜过大。

从FormCollection里面的Files中取啊

  2.流式处理:直接读取请求体装载后的Section 对应的stream 直接操作strem即可。无需把整个请求体读入内存,

估计就是你因为用的是USB3.0接口是扩展卡的原因,因为我也是东芝黑甲虫1T,我的笔记本是东芝的,有USB3.0的接口,速度能达到3.0 的速度,只要是笔记本有3.0的接口铁定能达到,你现在的速度是2.0 的速度

以下为官方微软说法

请教怎样正确配置leapftp或者serv u?一般来说SERV-U安装好了后,是以SYSTEM用户进行运行的,如果你的文件夹系统中没有SYSTEM的权限,才会导致错误。

缓冲

  整个文件读入 IFormFile,它是文件的 C# 表示形式,用于处理或保存文件。 文件上传所用的资源(磁盘、内存)取决于并发文件上传的数量和大小。 如果应用尝试缓冲过多上传,站点就会在内存或磁盘空间不足时崩溃。 如果文件上传的大小或频率会消耗应用资源,请使用流式传输。

流式处理   

  从多部分请求收到文件,然后应用直接处理或保存它。 流式传输无法显著提高性能。 流式传输可降低上传文件时对内存或磁盘空间的需求。

文件大小限制

  说起大小限制,我们得从两方面入手,1应用服务器Kestrel 2.应用程序(我们的netcore程序),

1.应用服务器Kestre设置

  应用服务器Kestrel对我们的限制主要是对整个请求体大小的限制通过如下配置可以进行设置(Program -> CreateHostBuilder),超出设置范围会报 BadHttpRequestException: Request body too large 异常信息

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel((context, options) => { //设置应用服务器Kestrel请求体最大为50MB options.Limits.MaxRequestBodySize = 52428800; }); webBuilder.UseStartup<Startup>();});

2.应用程序设置

  应用程序设置 (Startup->  ConfigureServices) 超出设置范围会报InvalidDataException 异常信息

services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = long.MaxValue; });

通过设置即重置文件上传的大小限制。

源码分析

  这里我主要说一下 MultipartBodyLengthLimit  这个参数他主要限制我们使用“缓冲”形式上传文件时每个的长度。为什么说是缓冲形式中,是因为我们缓冲形式在读取上传文件用的帮助类为 MultipartReaderStream 类下的 Read 方法,此方法在每读取一次后会更新下读入的总byte数量,当超过此数量时会抛出  throw new InvalidDataException($"Multipart body length limit {LengthLimit.GetValueOrDefault()} exceeded.");  主要体现在 UpdatePosition 方法对 _observedLength  的判断

以下为 MultipartReaderStream 类两个方法的源代码,为方便阅读,我已精简掉部分代码

Read

public override int Read(byte[] buffer, int offset, int count) { var bufferedData = _innerStream.BufferedData;      int read;     read = _innerStream.Read(buffer, offset, Math.Min(count, bufferedData.Count)); return UpdatePosition(read);}

UpdatePosition

private int UpdatePosition(int read) { _position += read; if (_observedLength < _position) { _observedLength = _position; if (LengthLimit.HasValue && _observedLength > LengthLimit.GetValueOrDefault()) { throw new InvalidDataException($"Multipart body length limit {LengthLimit.GetValueOrDefault()} exceeded."); } } return read;}

通过代码我们可以看到 当你做了 MultipartBodyLengthLimit 的限制后,在每次读取后会累计读取的总量,当读取总量超出

 MultipartBodyLengthLimit  设定值会抛出 InvalidDataException 异常,

最终我的文件上传Controller如下

  需要注意的是我们创建 MultipartReader 时并未设置 BodyLengthLimit  (这参数会传给 MultipartReaderStream.LengthLimit )也就是我们最终的限制,这里我未设置值也就无限制,可以通过 UpdatePosition 方法体现出来

using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.WebUtilities;using Microsoft.Net.Http.Headers;using System.IO;using System.Threading.Tasks; namespace BigFilesUpload.Controllers{ [Route("api/[controller]")] public class FileController : Controller { private readonly string _targetFilePath = "C:\\files\\TempDir"; /// <summary> /// 流式文件上传 /// </summary> /// <returns></returns> [HttpPost("UploadingStream")] public async Task<IActionResult> UploadingStream() { //获取boundary var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value; //得到reader var reader = new MultipartReader(boundary, HttpContext.Request.Body); //{ BodyLengthLimit = 2000 };// var section = await reader.ReadNextSectionAsync(); //读取section while (section != null) { var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition); if (hasContentDispositionHeader) { var trustedFileNameForFileStorage = Path.GetRandomFileName(); await WriteFileAsync(section.Body, Path.Combine(_targetFilePath, trustedFileNameForFileStorage)); } section = await reader.ReadNextSectionAsync(); } return Created(nameof(FileController), null); } /// <summary> /// 缓存式文件上传 /// </summary> /// <param name=""></param> /// <returns></returns> [HttpPost("UploadingFormFile")] public async Task<IActionResult> UploadingFormFile(IFormFile file) { using (var stream = file.OpenReadStream()) { var trustedFileNameForFileStorage = Path.GetRandomFileName(); await WriteFileAsync(stream, Path.Combine(_targetFilePath, trustedFileNameForFileStorage)); } return Created(nameof(FileController), null); } /// <summary> /// 写文件导到磁盘 /// </summary> /// <param name="stream">流</param> /// <param name="path">文件保存路径</param> /// <returns></returns> public static async Task<int> WriteFileAsync(System.IO.Stream stream, string path) { const int FILE_WRITE_SIZE = 84975;//写出缓冲区大小 int writeCount = 0; using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write, FILE_WRITE_SIZE, true)) { byte[] byteArr = new byte[FILE_WRITE_SIZE]; int readCount = 0; while ((readCount = await stream.ReadAsync(byteArr, 0, byteArr.Length)) > 0) { await fileStream.WriteAsync(byteArr, 0, readCount); writeCount += readCount; } } return writeCount; } }}

总结:

如果你部署 在iis上或者Nginx 等其他应用服务器 也是需要注意的事情,因为他们本身也有对请求体的限制,还有值得注意的就是我们在创建文件流对象时 缓冲区的大小尽量不要超过netcore大对象的限制。这样在并发高的时候很容易触发二代GC的回收.

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

我们如果要实现上传或者下载自己需要的flash到服务器上,我们可以通过flash的FileReference 和FileReferenceList 类进行操作。FileReferenceList 类和FileReference 的区别在于FileReferenceList 可以一次性上传多个文件。我们var fileReference:FileReference=new FileReference();实例化一个fileReference对象,然后调用download()方法。flash需要一个URLRequest参数,告之服务器从哪里下载需要的文件,然后在download函数调用完后会弹出一个对话框,让你保存你选择保存的位置。这样如果文件名在服务器上是aa.txt那么在本地保存的也是aa.txt,我们可以指定download的第二个参数指定要保存的文件名称。我们最好把download写在trycatch异常处理函数中,最好在下载的时候为它增加一个addEventListener(IOErrorEvent.IO_ERROR,onIOError);错误处理函数,一旦下载错误的时候可以通知服务器进行处理。同理用户在选择好路径选择好保存好这取消对话框的时候也会触发事件,我们可以增加侦听addEventListener(Event.SELECT,onSelectFile)。也可以增加addEventListener(Event.CANCEL,onCancelDialog);然后可以在用户选择完毕后获得一些信息,显示出来。我们也可以通过addEventListener(ProgressEvent.PROGRESS,onFileProgress);增加一个下载进度侦听,我们可以获得下载的字节数和总字节数通过bytesLoaded和bytesTotal这两个属性。addEventListener(Event.COMPLETE,onFileComplete);可以在文件完全下载完后触发。如果我们要上传文件,首先我们要先在本地选择要上传的flash文件,我们通过browse()方法,弹出一个选择框来选择,我们可以通过FileFilter对象数组作为browse()方法的参数来选择你要上传的类型。我们同理可以监听addEventListener(Event.SELECT,onSelectFile),来判断用户是否已经点击了选择,如果确定后,可以直接调用 upload()方法,upload也至少必须传入一个路径,那就是上传服务器地址。upload方法是通过post方式来提交数据的,Content-Type为multipart/form-data,默认下Content-Disposition设置为Filedata,因为脚本需要知道Content-Disposition值以便读取文件数据。至此,flash上传和下载文件就讲完了内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • .net core实现图片文件上传下载功能
  • asp.net core文件上传与下载实例(多种上传方式)
  • asp.net core实现文件上传功能
  • .netcore实现上传多文件的示例详解
  • 解决asp.net core mvc文件上传限制问题实例
  • asp.net core mvc实现文件上传实例
  • asp.net core分块上传文件示例
  • .net core版 文件上传/ 支持批量上传拖拽及预览功能(bootstrap fileinput上传文件)
  • asp.net 文件下载功能函数代码整理
  • 使用asp.net操作iis7中应用程序
  • 通过c#动态生成图书信息xml文件
  • asp.net mvc 布局页、模板页使用方法详细介绍
  • asp.net gridview中使用radiobutton单选按钮的方法
  • 详解asp.net core封装layui组件示例分享
  • 如何利用httpclientfactory实现简单的熔断降级
  • asp.net中radiobuttonlist绑定后台数据后触发点击事件
  • 详解在.net中读写config文件的各种方法
  • asp.net mvc 分页、检索、排序整体实现代码
  • as 3.0 如何浏览文件,实现文件上传和下载功能。
  • thinkphp3.0图片上传正常,图片修改提示“非法上传文件”
  • android okhttp3.0文件上传是用什么方式上传的
  • 超过3.0G 的wmv.文件如何上传
  • scratch3.0上传文件无反应怎么办
  • twrp3.0.2怎么从电脑往手机上传文件
  • MVC3.0 怎么得到一个上传文件的完整路径
  • 为什么我USB3.0的移动硬盘接USB3.0接口传文件只有25M啊?
  • leapftp3.0上传文件到网站空间失败
  • 为什么我传文件有时候2.0接口比3.0接口快呢,我的u盘是3.0接口的
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧.net core实现图片文件上传下载功能asp.net core文件上传与下载实例(多种上传方式)asp.net core实现文件上传功能.netcore实现上传多文件的示例详解解决asp.net core mvc文件上传限制问题实例asp.net core mvc实现文件上传实例asp.net core分块上传文件示例.net core版 文件上传/ 支持批量上传拖拽及预览功能(bootstrap fileinput上传文件)asp.net 文件下载功能函数代码整理使用asp.net操作iis7中应用程序通过c#动态生成图书信息xml文件asp.net mvc 布局页、模板页使用方法详细介绍asp.net gridview中使用radiobutton单选按钮的方法详解asp.net core封装layui组件示例分享如何利用httpclientfactory实现简单的熔断降级asp.net中radiobuttonlist绑定后台数据后触发点击事件详解在.net中读写config文件的各种方法asp.net mvc 分页、检索、排序整体实现代码java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx".aspx中的命名空间设置实现代码linq操作数组代码(交集,并集,差集,最值,asp.net core自定义本地化教程之从文本文asp.net中mvc使用ajax调用jsonresult方法asp.net 该行已经属于另一个表错误的解决asp.net用owc操作excel的实例代码利用typings为visual studio code实现智能c#利用服务器实现客户端之间通信asp.net在页面所有内容生成后、输出内容前asp.net使用服务器控件image/imagebutton
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved