html5文件上传-iis7报奇怪的404(NotFound)错误
最近碰到的最恶心的问题了,各种google各种请教无果,后来用chrome的开发工具仔细看了下web服务器的响应信息才知道原因。。。
记录一下,看看谁也碰到过。
背景
早些时候参考http://code.google.com/p/html5uploader/ 写了一个jquery的html5上传控件。
昨天在一个asp.net mvc3的网站中测试时遇到一些很恶心的问题:
1,文件小的时候,可以正常上传。(比如10M左右都可以。我改了web.config,<httpRuntime executionTimeout="300" maxRequestLength="2048000" />,理论上可以传200M)
2,在上传一个45MB的PSD文件时,报404错误。
404啊。。。一般是web server找不到资源时才会报的错误,怎么可能在文件上传的时候抛出这种类型的异常呢???最要命的是文件比较小的时候是正常的。
chrome 控制台报的错误:
Failed to load resource: the server responded with a status of 404 (Not Found)
chrome network监控默认视图:
点击进去后的视图
问题是什么?
用chrome看服务器响应信息的时候,一般是上面这两个视图。。。
大多数的同学可能都忽略了右边的“Preview”和"Response"这两个tab。。只会看看headers里面的基本信息,知道问题是404 not found,但是不知具体的原因
太坑爹了,我也找了一天的原因才跑去点击“Preview”和“Reponse”!!!
其实问题和我一开始预想的一样,肯定和服务器配置相关,iis服务器对于http请求的文件流默认有大小限制。
但是根据msdn文档我已经把maxRequestLength改的够大的了,难道还有别的配置项影响么??
来个"Preview" tab的截图
解决办法
上面的截图已经够清楚的了,
1,在iis里面除了System.Web 段落的maxRequestLength需要修改至合适的大小外.单位是kb
<httpRuntime executionTimeout="300" maxRequestLength="2048000"/>
2,在System.WebServer段落的地方,要修改maxAllowedContentLength,单位是btye。例如下面的配置设成300M
<!--影响上传大小的配置maxAllowedContentLength,iis7默认是30000000 bytes即30M,以下配置为300M-->
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="300000000"></requestLimits>
</requestFiltering>
</security>
其他注意点:
html5 ajax上传时需使用html5提供的FileReader在客户端读取文件,在chrome里面,可以使用FormData对象,作为xmlhttprequest实例的send方法的参数的值。也可以使用window.btoa方法将文件转换成base64编码的文本流,然后做为send方法的参数的值。如果使用btoa,实际传输的字节数要比文件本身的大小要大。
参考资料
1,IIS7 needs both maxRequestLength and maxAllowedContentLength. Why?
http://forums.asp.net/t/1637223.aspx/1
2,maxRequestLength and IIS7
http://forums.iis.net/p/1150009/1993988.aspx