• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        用2行代碼在瀏覽器中完成文件上傳

        用2行代碼在瀏覽器中完成文件上傳

        更新時間:2020-02-09 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        簡介
        文件上傳是將任意的文件從客戶機(jī)發(fā)送到服務(wù)器的過程。最簡單、最方便的上傳方法是使用支持RFC1867的瀏覽器,如微軟的Internet Explorer4.0以上版本,Netscape3.0以上版本,或者帶附件的Internet Explorer3.0。基于瀏覽器的文件上傳是通過帶有屬性ENCTYPE="multipart/form-data"的HTML form實現(xiàn)的。這個form也必須包含一個或多個<INPUT TYPE=FILE>項,以讓用戶指定要上傳的本地文件。


        帶有ENCTYPE="multipart/form-data"屬性的form所發(fā)送的數(shù)據(jù)必須被一個服務(wù)器端過程解析,以展開上傳的文件和其他非文件項。在ASP環(huán)境中,這種任務(wù)用編譯好的active server組件能最好的完成,比如Persits軟件公司的AspUpload
        (http://www.persits.com)。

        本文所有示例都是建立在你的系統(tǒng)中安裝了AspUpload的基礎(chǔ)上的。可以在這里下AspUpload
        免費(fèi)評估版http://www.persits.com/aspupload.html。解壓文件后,將AspUpload.dll
        放在任意目錄中,在MS DOS窗口中執(zhí)行命令

        regsvr32 c:\dir\AspUpload.dll
        開始
        我們來創(chuàng)建一個簡單的能上傳3個文件的HTML form,和控制上傳的腳本。
        這里是第一個HTML文件
        Test1.htm:
        <HTML>
        <BODY BGCOLOR="#FFFFFF">

        <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript1.asp">
        <INPUT TYPE=FILE SIZE=60 NAME="FILE1"><BR>
        <INPUT TYPE=FILE SIZE=60 NAME="FILE2"><BR>
        <INPUT TYPE=FILE SIZE=60 NAME="FILE3"><BR>
        <INPUT TYPE=SUBMIT VALUE="Upload!">
        </FORM>
        </BODY>
        </HTML>
        每個 <INPUT TYPE=FILE> 項在瀏覽器中顯示成為一個帶有"Browse..."按鈕的文本輸入框。如果你沒看見Browse按鈕,很有可能說明你的瀏覽器不支持文件上傳。

        這里是相應(yīng)的上傳腳本 UploadScript1.asp:
          <HTML>  
        <BODY>  
        <%  
        Set Upload = Server.CreateObject("Persits.Upload.1")  
        Count = Upload.Save("c:\upload")
        %>
        <% = Count %> files uploaded.  
        </BODY>  
        </HTML>




        ASP腳本的第一行僅僅創(chuàng)建了一個AspUpload對象的實例。第二行調(diào)用組件的Save方法,它實際上的作用是:它解析從瀏覽器發(fā)送的東西,計算出有多少個文件正在上傳,并且把他們存在服務(wù)器上指定的目錄。目錄名可能以反斜線結(jié)束,也可能不是。所有文件將以他們原來的名字存放在目錄中。我們很快將看到如何更改任意或者所有文件的名字。

        Save方法返回成功上傳的文件數(shù)量。萬一發(fā)生錯誤,這個方法將拋棄之。

        注意你能夠使用我們的form中任意或者全部三個輸入框。AspUpload有足夠的智慧判斷出哪些輸入框使用了,哪些沒有。
          

        使用FILES和FORMS集合訪問單個form項
        我們看看第二組示例:

        Test2.htm
        <HTML>
        <BODY BGCOLOR="#FFFFFF">

        <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript2.asp">
        File 1:<INPUT TYPE=FILE NAME="FILE1">
        Description 1:<INPUT TYPE=TEXT NAME="DESCR1"><BR>
        File 2:<INPUT TYPE=FILE NAME="FILE2">
        Description 2:<INPUT TYPE=TEXT NAME="DESCR2"><BR>

        <INPUT TYPE=SUBMIT VALUE="Upload!">

        </FORM>
        </BODY>
        </HTML>
          
        UploadScript2.asp <HTML>  
        <BODY>  
        <%  
        Set Upload = Server.CreateObject("Persits.Upload.1")  
        Upload.Save "c:\upload"
        %>  
        Files:<BR>  
        <%  
        For Each File in Upload.Files  
        Response.Write File.Name & "=" & File.Path & " (" & File.Size & ")<BR>"
        Next
        %>  
        <P>  
        Other items:<BR>  
        <%  
        For Each Item in Upload.Form  
        Response.Write Item.Name & "=" & Item.Value & "<BR>"
        Next
        %>  
        </BODY>  
        </HTML>



        注意我們的HTML form現(xiàn)在有兩種輸入框,TYPE=FILE 和 TYPE=TEXT。因為我們form的ENCTYPE屬性,我們不再能通過標(biāo)準(zhǔn)的ASP Response.Form 集合來訪問form變量。此處Upload.Form 來解決了問題。這個集合實際上和Response.Form一樣,也就是,我們能通過整形或字串型索引訪問它的元素。例如:

        Set Item1 = Upload.Form("DESCR1")

        或者

        Set Item1 = Upload.Form(1).

        我們也能夠使用上面示例代碼顯示的For-Each語句遍歷集合中的項。Form集合包含F(xiàn)ormItem類型的對象,它只有兩個字串屬性,Name 和 Value (缺省屬性).

        記住Upload.Form集合僅僅包含非文件項,也就是不同于<INPUT TYPE=FILE>,這點很重要。AspUpload提供另外一個集合,叫做Files,來包含UploadedFile類型的對象,這種對象代表已經(jīng)上傳的來自<INPUT TYPE=FILE>項的文件。很象Form集合,F(xiàn)iles集合的項能夠通過使用字串或者整形索引,或者一個For-Each語句訪問,象上面的示例顯示的一樣。

        運(yùn)行示例2以后,我們將看到象這樣的一些東西:

        Files:
        FILE1=c:\upload\File1.xls (108544)
        FILE2=c:\upload\File2.zip (211687)

        Other items:
        DESCR1=bla bla
        DESCR2=test test

        注意我們已經(jīng)通過UploadedFile對象相應(yīng)的Path和Size屬性獲得了上傳過的文件的目標(biāo)路徑和文件大小。

        如果我們的form只包含一個文件輸入框,<INPUT TYPE=FILE NAME="ONLYFILE">,那么沒有必要使用For-Each語句。我們只需要這么說

        Response.Write Upload.Files("ONLYFILE").Path

        或者,更常用的

        Response.Write Upload.Files(1).Path


        要點:Files和Form集合在調(diào)用Save方法前都不會裝入,因此在調(diào)用Upload.Save前就查詢這些集合是不正確的。

        ' 錯誤!
        Upload.Save( Upload.Form("Path") )
        限制文件大小
        也許你需要限制上傳文件的大小,以防止服務(wù)器磁盤空間擁塞。你所需要做的一切就是在調(diào)用Save之前在你的Upload對象中調(diào)用SetMaxSize:
        Set Upload = Server.CreateObject("Persits.Upload.1")
        Upload.SetMaxSize 50000, False
        Upload.Save "c:\upload"

        在這個例子中,我們將上傳文件的大小限制在50000字節(jié)內(nèi)。第二個可選參數(shù)指定超出文件最大范圍的部分是否應(yīng)該被刪除(如果設(shè)成false或者不設(shè)),或者作為錯誤例外拒絕接收(如果設(shè)成True) 。

          

        強(qiáng)制特有文件名
        缺省的,AspUpload將覆蓋上傳路徑中已有的文件。如果你不想這樣,可以配置組件,為上傳文件產(chǎn)生特有的名字來防止覆蓋已有文件。方法是,在調(diào)用Save前設(shè)置上傳管理器的OverwriteFiles屬性:

        Upload.OverwriteFiles = False

        缺省值是true。

        為防止名字沖突,AspUpload將在原來文件名后面加上用圓括號括起來的整數(shù)。例如,如果文件MyFile.txt已經(jīng)存在于上傳目錄了,并且另外一個同名文件正在上傳,AspUpload會將新文件存為 MyFile(1).txt。如果我們上傳更多的MyFile.txt,他們將被存MyFile(2).txt, MyFile(3).txt,等等。
          

        移動、拷貝、刪除文件
        文件上傳對象提供了一些方法供你移動、拷貝或者刪除上傳的文件。這些方法是
        file.Move( NewName As String )
        file.Copy( NewLocation As String, Optional Overwrite)
        file.Delete

        根據(jù)NewName參數(shù),Move方法將文件移動到其他目錄或者給他更名。假設(shè)文件abc.txt上傳到了目錄
        c:\Upload。那么調(diào)用

        file.Move "c:\WINNT\abc.txt" 將把文件移動到 c:\WINNT, 而調(diào)用
        file.Move "c:\Upload\xyz.txt" 只會更改文件名。

        要知道Move方法有個副作用是很重要的:當(dāng)這個方法成功調(diào)用后,這個文件對象的Path屬性將指向新目錄/名字。

        Copy屬性把文件拷貝到新目錄/名字。新目錄必須是完全合法的路徑。 Overwrite參數(shù)如果設(shè)成True或者不設(shè),就會指示Copy方法覆蓋新目錄里的已有文件。 如果設(shè)成False,當(dāng)文件在新目錄中已經(jīng)存在地時候,會導(dǎo)致方法失敗。與Move方法不同,這個方法不會影響Path屬性。

        有時你可能選擇使用Delete方法,例如你在把文件作為BLOBs存入數(shù)據(jù)庫中,并且不再需要它放在你的上傳路徑里時。將文件存入數(shù)據(jù)庫是我們下一個要討論的主題。

          

        把文件作為BLOBs存入數(shù)據(jù)庫
        許多數(shù)據(jù)庫管理系統(tǒng)象Ms Access或者SQL Server將允許你將任意文件存為"binary large objects"(BLOBs)。一個MS Access表格能夠在OLE Object型的數(shù)據(jù)字段中存放二進(jìn)制文件。在SQL Server中,相應(yīng)的數(shù)據(jù)類型是IMAGE。存放的文件以后能夠重新取出供下載,或者用ADO顯示。
        AspUpload讓你只使用短短一行代碼就能把上傳文件存入數(shù)據(jù)庫!讓我們看看第三組示例文件。文件 Test3.htm幾乎和Test1.htm相同,因此我們不再把它顯示在這里。文件UploadScript4.asp 很值得我們注意:
          
          <HTML>  
        <BODY>  
        <%  
        Set Upload = Server.CreateObject("Persits.Upload.1")  
        Upload.Save "c:\upload"  
        On Error Resume Next  
        For Each File in Upload.Files  

        File.ToDatabase "DSN=data;UID=sa;PWD=xxx;", "insert into Blobs(id, Path, BigBlob) values(12, '" & File.Path & "', ?)"
        if Err <> 0 Then  
        Response.Write "Error saving the file: " & Err.Description
        Else  
        File.Delete  
        Response.Write "Success!"
        End If

        Next
        %>  
        </BODY>  
        </HTML>



        這一行

        On Error Resume Next

        指示asp當(dāng)以外發(fā)生時,不要顯示錯誤信息,只將意外代碼和描述存放到內(nèi)建的Err對象,并且繼續(xù)腳本的執(zhí)行。

        下一行

        File.ToDatabase "DSN=data;UID=sa;PWD=xxx;", "insert into Blobs(id, Path, BigBlob) values(12, '" & File.Path & "', ?)"

        是將文件存放入數(shù)據(jù)庫所采用的一切。我們來檢查一下這個方法的兩個參數(shù):

        第一個參數(shù)是下列格式的ODBC連接字串:

        "DSN=datasource;UID=userid;PWD=password;<other optional parameters>"

        第二個參數(shù)是SQL INSERT或者UPDATE語句,帶有一個問號(?),并且只能帶一個。它的作用是為要存儲的文件提供空間容器。在這個例子中,我們下部的數(shù)據(jù)庫表Blobs包含三欄:一個Integer ID,一個VARCHAR Path,和一個IMAGE BigBlob。這個SQL INSERT語句將12放入ID欄,文件路徑放入Path欄,真實文件放入BigBlob欄。

        下一行檢查語句在成功執(zhí)行前是否正確。如果成功,Err對象取值0并且刪除文件
        (File.Delete行),因為文件已經(jīng)存入數(shù)據(jù)庫,不需要再放在上傳路徑中了。否則,Err包含一個數(shù)字錯誤代碼,并且Err.Description包含對于意外的語言描述。


        將GIF和JPEG圖象存入數(shù)據(jù)庫很常見。將圖象從數(shù)據(jù)庫中取出并顯示在HTML頁中,你不需要使用任何第三方組件。ADO就能完成任務(wù)。

        在你的HTML頁面中放入普通<IMG>標(biāo)簽,將SRC屬性指向一個ASP腳本,例如

        <IMG SRC="GetImage.asp?id=4">

        GetImage.asp 腳本看起來可能會是這樣

        <%
        Set db = Server.CreateObject("ADODB.Connection")
        db.Open "data"
        Set rs =db.Execute("SELECT BigBlob FROM Blobs where id = " & Request("id") )
        Response.ContentType = "image/jpeg" '(or "image/gif")
        Response.BinaryWrite rs("BigBlob")
        %>


        --------------------------------------------------------------------------------
        哪里能得到更多關(guān)于AspUpload的信息
        要得到完整的AspUpload文檔,并下載免費(fèi)評估版本,請訪問Persists軟件公司的web站點
        http://www.persits.com/aspupload.html。這個組件的注冊費(fèi)用是$99.00(單CPU協(xié)議)。
        常問到的問題
        問:  AspUpload能在所有ASP版本上工作嗎?
        答:  不.早期版本ASP的Request對象不提供BinaryRead或者TotalBytes方法,而本組件對這兩個方法依賴很大。檢驗?zāi)愕腁SP版本是否允許上傳的最好方法是執(zhí)行象<% n = Request.TotalBytes %>這樣一句簡單的腳本,看你的ASP模塊能否識別。

        問:  哪里能獲得最新版本的ASP?
        答:這取決于你的web服務(wù)器的版本。如果你使用PWS或者IIS3.0,你可以到
        http://www.microsoft.com/office/intranet/modules/asp411s3.asp下載最新版本。如果你使用IIS4.0你可以從http://www.microsoft.com/iis下載并安裝Option Pack 4。

        問: 微軟Internet Explorer 3.0支持文件上傳嗎?
        答:  缺省的,是不支持。但是有一個IE3的附件可以用,從此下載 http://www.microsoft.com/msdownload/iebuild/ie3add_win32/en/ie3add_win32.htm.
          

        關(guān)于作者
        Peter Persits (peter@persits.com)是Persits Software, Inc的創(chuàng)建者和總裁,流行ASP組件 AspNTUser, AspGrid, AspAccessControl, AspUpload 和 AspEmail的作者。Peter已經(jīng)從事軟件開發(fā)10多年。他擁有American University (Washington, DC)的計算機(jī)科學(xué)碩士學(xué)位,并且是微軟認(rèn)證解決方案開發(fā)員。他現(xiàn)住在Arlington, VA。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 国产精品国产亚洲区艳妇糸列短篇| 97久久精品亚洲中文字幕无码 | 亚洲精品免费在线观看| 亚洲无码视频在线| 成人无码精品1区2区3区免费看| 四虎成人精品在永久免费| 亚洲成熟丰满熟妇高潮XXXXX| 成人免费视频国产| 婷婷国产偷v国产偷v亚洲| 免费一级成人毛片| 美美女高清毛片视频黄的一免费| 国产精品无码素人福利免费| 无码一区二区三区亚洲人妻| 亚洲精品人成无码中文毛片 | 国产成人亚洲综合无码| 国产特黄特色的大片观看免费视频 | 亚洲AV无码专区电影在线观看| 国内精品免费久久影院| 亚洲产国偷V产偷V自拍色戒 | 久久精品夜色国产亚洲av| 国产va在线观看免费| 久久精品国产亚洲av高清漫画| 国产福利在线免费| 久久亚洲中文无码咪咪爱| 亚洲精品无码永久在线观看 | 亚洲日本国产精华液| 成年女人色毛片免费看| 四虎精品免费永久免费视频| 亚洲一区二区三区无码中文字幕| 人妻无码久久一区二区三区免费| 亚洲日本乱码一区二区在线二产线| 毛片免费全部免费观看| 成人免费夜片在线观看| 婷婷精品国产亚洲AV麻豆不片 | 亚洲精品免费视频| 最近中文字幕mv手机免费高清 | 亚洲色婷婷六月亚洲婷婷6月| 无码av免费网站| 亚洲av无码成人精品区一本二本| 亚洲日韩VA无码中文字幕| 日本视频一区在线观看免费|