none
需要上傳大量大型檔案的系統(ASP.net 2.0 + Java Applet|ActiveX) RRS feed

  • 問題

  • 由於小弟我在國小任教
    需要設計一套系統可以讓所有老師上傳教材與簡報檔案
    檔案有簡報與影片大小會有 50~150 Mb

    在很久以前還有看過可以用拖曳方式直接拉進瀏覽器中(Java Applet)
    拖曳功能不是必需,但是並非所有 Client 都在內部網路之中所以不想單純增大 post size 來處理。
    所以想在此請教各位先進是否可以提供解決方案 ?
    ------------------------------------------------------------------------------------
    經過一點點的搜尋
    以下這個網站比較近似我的想法(免費註冊可有 1G 空間)
    http://www.box.net/
    他在上傳時可以選擇 POST 或是使用拖檔案到 Java applet
    如果有興趣可以參考一下

    2006年2月27日 上午 10:10

解答

  • 樓上的方式還是沒解決檔案太大 甚至有時需要續傳的問題

    Code Project 有一篇 AJAX File Upload 

    它使用把檔案切成一塊一塊的方式, 用AJAX透過WebService的方式上傳
    而且還能續傳~

    它原文的介紹翻譯如下, 請大家多指教

    使用HTTP方式上傳檔案到網站有個大問題是來自ClientServer雙方的一些限制。雖然網路頻寬的一直在增加,但主要的問題還是出在檔案的大小,有時因為受到Request Length的限制,我們不太可能上傳一個500MB的檔案。其中一個解決方式是增加Request Length的限制,但有可能因記憶體爆掉害我們得重開Web Server。例如:ASP.NET IIS Web Server. 我們把maxRequestLength 增到500MB, memoryLimit預設值是60%,這表示行程使用超過60%以上的記憶體時會進行回收。如果我們的實體記憶體是1G使用者同時上傳的檔案超過400MB的時候Web Server無法在要求的物件中釋放記憶體,Server就會有很高的機會要重開。而另一個大問題是續傳檔案,當因者某種原因而中斷上傳時,一般使用者要整個檔案再次上傳。這個例子說明如何使用AJAXWebService實作一個檔案上傳的方式,當然,這種方法有其限制*,但它對Intranet的方案及網際網路網站的管理方面還是很有用。

     

    *譯註,它使用了Client端的ADODB.StreamScripting.FileSystemObject Active X物件

     

    2006年2月27日 下午 02:50
  • 稍微翻了一下,他用 ADODB 來讀 Binary 後,再轉為 Base64 ,這樣會讓檔案放大 1.5 倍以上,500 MB 上傳量會變成 750 MB 以上,並不會很好。

    既然用 ADODB ,那就乾脆自己用 .Net framework 2.0 來做一個簡單的 socket 或是 ftp 功能,還可以自己在程式碼內加掛壓縮,這樣應該會比較小,而且也能做更多的功能。

    不然就是直接把 url 轉為 ftp url ,這樣 IE 也可以直接拖檔進去...

    2006年2月27日 下午 03:55
    版主

所有回覆

  • Dear Sir,

    試試以下Sample Code吧

     

    default.asp

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="Advanced_ASPNET.Ftp" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <title>Ftp</title>
      <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
      <meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
      <meta content="JavaScript" name="vs_defaultClientScript">
      <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
     </HEAD>
     <body MS_POSITIONING="GridLayout">
      <form id="Form1" method="post" runat="server">
       <P><FONT face="新細明體" size="4">上傳檔案:</FONT></P>
       <P><FONT face="新細明體" size="4">下載檔案:</FONT></P>
       <hr>
       <asp:label id="Label1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 120px" runat="server"
        Height="16px" Width="240px"></asp:label>
       <P><FONT face="新細明體"></FONT></P>
       <P><FONT face="新細明體" size="4"></FONT></P>
       <P><FONT face="新細明體" size="4"></FONT></P>
       <asp:button id="Button1" style="Z-INDEX: 102; LEFT: 424px; POSITION: absolute; TOP: 16px" runat="server"
        Height="24px" Width="48px" Text="確定"></asp:button><INPUT id="file" style="Z-INDEX: 103; LEFT: 120px; WIDTH: 296px; POSITION: absolute; TOP: 16px; HEIGHT: 24px"
        type="file" size="30" runat="server">
       <asp:dropdownlist id="DropDownList1" style="Z-INDEX: 104; LEFT: 120px; POSITION: absolute; TOP: 56px"
        runat="server" Height="32px" Width="240px"></asp:dropdownlist><asp:button id="Button2" style="Z-INDEX: 105; LEFT: 368px; POSITION: absolute; TOP: 56px" runat="server"
        Width="48px" Text="下載"></asp:button></form>
     </body>
    </HTML>

    default.asp.vb

     

    Public Class Ftp
        Inherits System.Web.UI.Page

    #Region " Web Form 設計工具產生的程式碼 "

        '此為 Web Form 設計工具所需的呼叫。
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        End Sub
        Protected WithEvents Button1 As System.Web.UI.WebControls.Button
        Protected WithEvents file As System.Web.UI.HtmlControls.HtmlInputFile
        Protected WithEvents Label1 As System.Web.UI.WebControls.Label
        Protected WithEvents DropDownList1 As System.Web.UI.WebControls.DropDownList
        Protected WithEvents Button2 As System.Web.UI.WebControls.Button

        '注意: 下列預留位置宣告是 Web Form 設計工具需要的項目。
        '請勿刪除或移動它。
        Private designerPlaceholderDeclaration As System.Object

        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: 此為 Web Form 設計工具所需的方法呼叫
            '請勿使用程式碼編輯器進行修改。
            InitializeComponent()
        End Sub

    #End Region

        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            '在這裡放置使用者程式碼以初始化網頁
            Me.DropDownList1.Items.Add("請選擇想下載的檔案")
            If Not IsPostBack Then
                Dim dir As New System.IO.DirectoryInfo(Me.Request.PhysicalApplicationPath & "\FileIO\FileUpload_Download\FileForDownload")
                Dim fi As System.IO.FileSystemInfo

                For Each fi In Dir.GetFileSystemInfos()
                    Dim Length As Integer = 30
                    If TypeOf fi Is System.IO.FileInfo Then
                        Dim f As System.IO.FileInfo = CType(fi, System.IO.FileInfo)
                        If (f.Name.Length < Length) Then
                            Length = f.Name.Length
                        End If
                        Dim fname As String = f.Name.Substring(0, Length)
                        Me.DropDownList1.Items.Add(fname)
                    End If
                Next
            End If
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '如果按下確定鈕的時候,傳回的檔案是空的
            If Not (file.PostedFile Is Nothing) Then
                Dim Length As Integer
                Dim FileNamePath As String
                Dim FileName As String

                '取得檔案名稱 (包含路徑)
                FileNamePath = file.PostedFile.FileName

                'StrReverse→在傳回的字串中,指定字串的字元順序變成是反向的。
                'Instr→傳回用來指定另一個字串內某一字串的第一個項目起始位置的整數。
                Length = InStr(1, StrReverse(FileNamePath), "\")

                '傳回包含來自某字串之指定字元數量的字串。
                ' +2 because 從檔案名稱字首開始取
                FileName = Mid(FileNamePath, (Len(FileNamePath) - Length) + 2)

                file.PostedFile.SaveAs("C:\" & FileName)
                Me.Label1.Text = "檔案上傳完成,儲存到:" & "C:\" & FileName
            End If
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim path, file As String
            path += "c:\download\"
            file = Me.DropDownList1.SelectedValue
            path += file
            Response.Redirect(path)
        End Sub
    End Class

    Thanks

    Louis Wang

    2006年2月27日 上午 10:30
  • 樓上的方式還是沒解決檔案太大 甚至有時需要續傳的問題

    Code Project 有一篇 AJAX File Upload 

    它使用把檔案切成一塊一塊的方式, 用AJAX透過WebService的方式上傳
    而且還能續傳~

    它原文的介紹翻譯如下, 請大家多指教

    使用HTTP方式上傳檔案到網站有個大問題是來自ClientServer雙方的一些限制。雖然網路頻寬的一直在增加,但主要的問題還是出在檔案的大小,有時因為受到Request Length的限制,我們不太可能上傳一個500MB的檔案。其中一個解決方式是增加Request Length的限制,但有可能因記憶體爆掉害我們得重開Web Server。例如:ASP.NET IIS Web Server. 我們把maxRequestLength 增到500MB, memoryLimit預設值是60%,這表示行程使用超過60%以上的記憶體時會進行回收。如果我們的實體記憶體是1G使用者同時上傳的檔案超過400MB的時候Web Server無法在要求的物件中釋放記憶體,Server就會有很高的機會要重開。而另一個大問題是續傳檔案,當因者某種原因而中斷上傳時,一般使用者要整個檔案再次上傳。這個例子說明如何使用AJAXWebService實作一個檔案上傳的方式,當然,這種方法有其限制*,但它對Intranet的方案及網際網路網站的管理方面還是很有用。

     

    *譯註,它使用了Client端的ADODB.StreamScripting.FileSystemObject Active X物件

     

    2006年2月27日 下午 02:50
  • 稍微翻了一下,他用 ADODB 來讀 Binary 後,再轉為 Base64 ,這樣會讓檔案放大 1.5 倍以上,500 MB 上傳量會變成 750 MB 以上,並不會很好。

    既然用 ADODB ,那就乾脆自己用 .Net framework 2.0 來做一個簡單的 socket 或是 ftp 功能,還可以自己在程式碼內加掛壓縮,這樣應該會比較小,而且也能做更多的功能。

    不然就是直接把 url 轉為 ftp url ,這樣 IE 也可以直接拖檔進去...

    2006年2月27日 下午 03:55
    版主
  • 不過它的好處是Server 不用另外開Port 直接走 Http ,
    Ftp or 自已開 Socket  都必需另外開Port 如果你的Server 有 Firewall就有麻煩
    而且使用IE直接拖的FTP也不支援續傳

    使用Web Service 一定會需要序列化成XML, 所以Base64是免不了的
    即使我們的Email的夾檔也是Base64

    它的缺點就是必需開IE的安全性,
    使'Scripting.FileSystemObject' 及 'ADODB.Stream' 要能在Client 的 Script 環境中使用

    當然都要開安全性了,乾脆自己寫一個ActiveX or WinFormUserContorl來上傳也是可以的啦~, 不但可以先壓縮,還可以來個多點上傳~ ^_^

    2006年2月28日 上午 04:58
  • 自己開發元件也可以實作走 http 的嘛~

    Office 2003 有送一個 MultiUpload 元件,如果你有裝 Office 2003 可以看一下畫面:

    http://tlcheng.no-ip.com/TLCheng/Basic/vbs/MultiUpload/

    MSDN 的範例程式碼網頁:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/tscliUploadMultDocs_SV01049092.asp

    2006年2月28日 上午 08:00
    版主
  • 感謝大家熱心的回答
    對於小紀提到 ActiveX or WinFormUserContorl 如果我想要開發不知道是不是有可以參考的網頁資料或是教學文章。
    感恩~

    以下是在此討論區找到的資源連結:
    提供給有興趣的人參考
    來源 : http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=265046&SiteID=14
    http://www.csharphelp.com/archives4/archive648.html
    http://www.china-askpro.com/msg48/qa28.shtml

    2006年3月1日 上午 12:13