记一次jquery file upload的断点续传的问题的纠结历程
相关参考:http://www.cnblogs.com/ASPNET2008/p/3360427.html
开始打算做断点续传的时候直接拷贝的这一串代码,放到我的项目里面之后Request.Files中的Filename获取到的一直是"blob",
然后我就拖啊拖了很久,后来打算放弃掉不做了,昨天测试Jquer File Upload这个上传组件的时候发现超过2G的文件死都传不上去!
1 <system.web> 2 <httpRuntime maxRequestLength="2147483647" executionTimeout="3600"/> 3 <compilation debug="true" targetFramework="4.0"/> 4 <customErrors mode="Off"/> 5 </system.web>
后来发现设置完之后支持的最大文件大小就差不多2G左右的样子,然后我又重新去做文件的断点续传!希望可以搞定这个问题!
但是!还是获取不到FileName!!!!
然后!我就换了一种方式用了Request.Headers["X-File-Name"],果然获取到FileName了!
但是!saveas里面又得不到content-range的值了!
又是一番纠结之后,发现是因为我用的插件的版本太低了。。然后!我又去官网上下载了最新版本的插件!
果然!不存在FileName和content-range获取不到的问题了!
又但是!超出2G的文件2G以上的部分还是不能上传!也是败给那个博主了!根本没有考虑过超大文件的问题嘛!
1 private void SaveAs(string saveFilePath, HttpPostedFile file) 2 { 3 long lStartPos = 0; 4 int startPosition = 0; 5 int endPosition = 0; 6 var contentRange=HttpContext.Current.Request.Headers["Content-Range"]; 7 //bytes 10000-19999/1157632 8 if (!string.IsNullOrEmpty(contentRange)) 9 { 10 contentRange = contentRange.Replace("bytes", "").Trim(); 11 contentRange = contentRange.Substring(0, contentRange.IndexOf("/")); 12 string[] ranges = contentRange.Split('-'); 13 startPosition = int.Parse(ranges[0]); 14 endPosition = int.Parse(ranges[1]); 15 } 16 System.IO.FileStream fs; 17 if (System.IO.File.Exists(saveFilePath)) 18 { 19 fs = System.IO.File.OpenWrite(saveFilePath); 20 lStartPos = fs.Length; 21 22 } 23 else 24 { 25 fs = new System.IO.FileStream(saveFilePath, System.IO.FileMode.Create); 26 lStartPos = 0; 27 } 28 if (lStartPos > endPosition) 29 { 30 fs.Close(); 31 return; 32 } 33 else if (lStartPos < startPosition) 34 { 35 lStartPos = startPosition; 36 } 37 else if (lStartPos > startPosition && lStartPos < endPosition) 38 { 39 lStartPos = startPosition; 40 } 41 fs.Seek(lStartPos, System.IO.SeekOrigin.Current); 42 byte[] nbytes = new byte[512]; 43 int nReadSize = 0; 44 nReadSize = file.InputStream.Read(nbytes, 0, 512); 45 while (nReadSize > 0) 46 { 47 fs.Write(nbytes, 0, nReadSize); 48 nReadSize = file.InputStream.Read(nbytes, 0, 512); 49 } 50 fs.Close(); 51 }
注意13行!14行!文件字节超出2G的时候int已经超出范围!
就是要把变量设置成long的数据类型嘛!
终于,一个多月过去了。。。
还是被我搞定了啊哈哈哈哈!!!!!