二十四画生的Blog


        ——开始学习DotNetNuke(DNN)
posts - 85, comments - 1173, trackbacks - 46, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

  前两天看过bestcomy 的关于大文件上传的系列文章真是受益匪浅,对ASP.NET中上传文件的方法又有全新的认识,这比原来简单的运用SaveAs()的方法不知要高明多少。认识提高了,新的想法就来了。不知道AspnetUpload组建能不能支持断点续传。不过将服务器上的文件上传到数据库的过程我想是可以实现断点续传的。将大文件上传到数据库的基本思路是:分次读取文件到缓冲区,利用使用 SQL Server 的 UPDATETEXT 函数将文件以指定大小的块区写入。关于实现断点续传,我的想法是在数据库中增加一个字段,用于表示已经上传的字节数。如果再次上传时可以将上次上传的结尾为起头继续上传文件。

再次上次时的处理过程:
1、读取image 列的文本指针值,SELECT @Pointer=TEXTPTR(Picture) FROM Categories WHERE CategoryID=@idx
2、分次写入的函数,UPDATETEXT Categories.Picture @Pointer @Offset @Delete WITH LOG @Bytes
  @Pointer 步骤1中取得的值
  @Offset 偏移量,分块的大小
  @Delete 为 0 表示不删除数据
  @Bytes 本次插入的数据
3、在读取文件数据时,与原来代码有所不同。想要知道上次已经上传的字节数(增一个字段保存)。先用br.ReadBytes(已经上传的字节数)使流的当前位置提升到本次要上传文件的起点。在用br.ReadBytes(BUFFER_LENGTH);分块读取要插入的数据。

  由于不知道AspnetUpload组件中的代码,不清楚bestcomy是如何实现客户端上载大文件到服务器上的方法,是不是还是分块上传的方法。如果是用分块上传的方法那么是否可以通过依次次追加的方式实现断点续传。


相关文档:
bestcomyBlog中的文章
http://files.cnblogs.com/bestcomy/FileToMSSQL.rar中有将文件上传到数据库的代码)
《将 BLOB 值写入 SQL Server 时保留资源》讲述了在.net下如何将大数据写入SQL Server的方法。

Feedback

#1楼    回复  引用  查看    

2005-05-10 21:49 by bestcomy      
AspnetUpload没有断点续传功能。

很多人都希望AspnetUpload能够像ftp一样可以断点续传,但是我认为是无法实现的。
首先,<input type=file>控件的value属性是只读的,那么即使记录了未上传完全文件的位置,我们也无法让客户端主动开始请求;
另外一个原因,每次post请求都是一个完整的合乎rfc规范的请求文本,必须重头开始分析,这是关键原因。当然也可以只分析而不保存来实现假的断点续传,但是我觉得没什么必要这么做。

#2楼    回复  引用  查看    

2005-05-10 22:06 by Microshaoft      
用 IE 作客户端根本无法,无机会,实现真正的有效断点续传 upload!

Application Client 倒是可以实现:
WebClient.UploadData
or
WebRequest
建议直接用 WebRequest 实现(当然是参考 Reflector WebClient)

我曾经WebRequest 实现过:
分块断点续传(Upload)的应用程序客户端及其配套的 Server 的 ASPX!
实际就是:
不但要传二进制数据另外就是 该段二进制数据在原文件的起止位置(相当于放在两个普通的文本域里)还有文件名之类的文本域等!
Server 的 ASPX 要编程支持该约定!

但后来发现:
其实实现 支持 分块断点续传(Upload)的应用程序客户端 的 WebService 方案(Server/Client)代码都更简单!

#3楼    回复  引用    

2005-05-11 09:12 by lion [未注册用户]
不是不可以实现,只是做为我个人觉得,应用的人不会很多,没有必须在IE中这样做

#4楼 [楼主]   回复  引用  查看    

2005-05-11 09:54 by 二十四画生      
@by lion
正如bestcomy说的一样,不能实现从客户端断点续传到服务器端的根本原因是因为每次post请求都是一个完整的合乎rfc规范的请求文本,必须重头开始分析。不过从IE上传文件的应用将会越来越多。B/S架构的应用,我相信也会越来越广。我做的几个OA系统都是基于B/S架构的,需要用到IE上传文件。ASP.NET的出现更是为B/S架构的推广奠定了坚实的基础。

#5楼    回复  引用    

2005-05-12 09:22 by 小贝 [未注册用户]
写控件可以做到的.纯粹用asp.net做不到.

#6楼    回复  引用    

2006-01-05 11:36 by zikun [未注册用户]
可以使用bits支持断点上传和断点下载

#7楼    回复  引用    

2007-04-01 09:45 by 路過的 [未注册用户]
我開發過一個OCX有點類似網路上那種縱橫HTTP上傳那種,不過是要連SERVER端都做客制化,我的經驗遇到比較大的問題是在SERVER端,說寫到緩衝區或是資料庫的都是蠢到爆的想法,你想想要是超過1g的時候主機都擺你的緩衝大概其他程式都不用跑了,資料庫片段對照碼也是笨想法;要是遇到大型檔案,你怎麼可能一個一個區段去做比對;把分段資料直接寫到資料庫更好笑,因為即使資料庫可以存放,你認為資料庫在運作時效能會有多高?這些想法我認為都只適合不超過一百M的小檔可以這樣做;我的經驗主要的問題有兩個,一個是客戶端的客制化,如何讓客戶端知道有哪些檔案區段沒有上傳,如何在一段時間上傳失敗後自動去重新上傳;這部分用ATIVEX物件不難處理;南的在於大量的資料船上SERVER的驗證與重組;我認為才是比較難的議題;客戶端那些切檔案與傳檔的標準HTTP協議程式到處都可以抓得到,對我而言反而只是剛開始的冰山一角吧!

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: