Làm th? nào đ? t?i lên t?p tin vào m?t máy ch? Web b?ng cách s? d?ng ASP

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 299692 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

Đ?i v?i m?t Microsoft Visual Basic.NET Phiên b?n c?a bài vi?t này, xem 315832.

TÓM T?T

Bài vi?t này mô t? cách b?t máy ch? Web c?a b?n nh?n đư?c giao d?ch chuy?n t?p tin t? các trang Microsoft Active Server Pages (ASP) b?ng cách s? d?ng m?t phía máy ch? Microsoft COM + thành ph?n.

Lưu ?: H? tr? c?a Microsoft ranh gi?i cho phát tri?n Visual Basic 6 đ? thay đ?i. Đ? bi?t thêm chi ti?t, xin vui l?ng xemhttp://MSDN.Microsoft.com/en-US/vstudio/ms788708.

Yêu c?u

  1. Microsoft Windows 2000 thông tin Internet c?a Microsoft Server 5,0 (IIS) đư?c cài đ?t và c?u h?nh
  2. N?u máy tính c?a b?n phát tri?n là m?t máy tính khác nhau hơn máy ch?, b?n ph?i có m?t m?ng h?p l? ho?c Internet k?t n?i t?i h? ph?c v? mà ch? các trang ASP.

Thi?t l?p d? án Microsoft Visual Basic 6 và m? s?

  1. B?t đ?u Visual Basic, và sau đó b?t đ?u m?t DLL ActiveX m?i d? án.
  2. Tên d? ánASPFileUpload.
  3. Thay đ?i tên c?a Class1 đ?T?p tin.
  4. Trên các D? án tr?nh đơn, nh?p vào Tài li?u tham kh?o.
  5. Trong các Tài li?u tham kh?o h?p tho?i, b?m đ? ch?n các tùy ch?n sau đây, và sau đó nh?p vào Ok:
    • Visual Basic cho các ?ng d?ng
    • Các đ?i tư?ng runtime Visual Basic và th? t?c
    • Các đ?i tư?ng Visual Basic và th? t?c
    • OLE t? đ?ng hóa
    • COM + d?ch v? lo?i thư vi?n
    • Microsoft Active Server Pages đ?i tư?ng thư vi?n
    • Microsoft Script Runtime
  6. Trên các D? án tr?nh đơn, nh?p vào Thu?c tính aSPFileUpload.
  7. Trong các Thu?c tính d? án h?p tho?i, Click vào đ? ch?n Th?c hi?n không giám sátCó th? gi? l?i b? nh?, sau đó b?m Ok.
  8. Dán m? sau đây đ? File.cls:
    Option Explicit
    
    Const ERR_INVALID_FILENAME = vbObjectError + 1000
    Const ERR_INVALID_TARGET = vbObjectError + 1001
    Const ERR_FILE_EXISTS = vbObjectError + 1002
    Const ERR_UPLOAD_CALLED = vbObjectError + 1003
    Const VB_ERR_PATH_NOT_FOUND = 76
    
    Private m_objContext As ObjectContext
    Private m_objRequest As ASPTypeLibrary.Request
    
    Private m_strTarget As String
    Private m_strFileName As String
    Private m_blnOverWrite As Boolean
    Private m_blnUploaded As Boolean
    Private m_lngTotalBytes As Long
    
    'All other form elements go here.
    Private m_formCol As Scripting.Dictionary
    
    Implements ObjectControl
    
    Private Function ObjectControl_CanBePooled() As Boolean
      ObjectControl_CanBePooled = False
    End Function
    
    Private Sub ObjectControl_Activate()
      Set m_objContext = GetObjectContext()
      Set m_objRequest = m_objContext("Request")
      Set m_formCol = New Scripting.Dictionary
    End Sub
    
    Private Sub ObjectControl_Deactivate()
      Set m_objContext = Nothing
      Set m_objRequest = Nothing
      Set m_formCol = Nothing
    End Sub
    
    Public Sub Upload()
      
      Const DEFAULT_CHUNK_SIZE = 262144 '256kb
      
      Dim bytBeginOfChunk() As Byte
      Dim bytEndOfChunk() As Byte
      Dim bytBeginOfName() As Byte
      Dim bytEndOfName() As Byte
      Dim bytBeginOfFile() As Byte
      Dim bytEndOfFile() As Byte
      Dim bytBeginOfValue() As Byte
      Dim bytEndOfValue() As Byte
      Dim bytName() As Byte
      Dim bytValue() As Byte
      Dim bytThisChunk() As Byte
      Dim bytFileName() As Byte
      Dim lngBeginOfChunk As Long
      Dim lngEndOfChunk As Long
      
      Dim lngBeginOfAttribute As Long
      Dim lngEndOfAttribute As Long
      Dim lngBeginOfValue As Long
      Dim lngEndOfValue As Long
      Dim blnEndOfData As Boolean
      Dim lngChunkSize As Long
      Dim lngBytesLeft As Long
      Dim lngFileNum As Long
      Dim strFileName As String
      
      On Error GoTo UploadErr
      
      If Uploaded Then
        Err.Raise ERR_UPLOAD_CALLED, App.Title, "The Upload method has already been called."
      End If
         
      bytBeginOfChunk = StrConv("-----------------------------", vbFromUnicode)
      bytEndOfChunk = StrConv("-----------------------------", vbFromUnicode)
      
      bytBeginOfName = StrConv("name=", vbFromUnicode) & ChrB(34)
      bytEndOfName = ChrB(34)
      
      bytBeginOfFile = StrConv("filename=", vbFromUnicode) & ChrB(34)
      bytEndOfFile = ChrB(34)
      
      bytBeginOfValue = ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10)
      bytEndOfValue = ChrB(13) & ChrB(10) & StrConv("-----------------------------", vbFromUnicode)
         
      'Initialize the chunk size.
      If m_objRequest.TotalBytes <= DEFAULT_CHUNK_SIZE Then
        lngChunkSize = m_objRequest.TotalBytes
      Else
        lngChunkSize = DEFAULT_CHUNK_SIZE
      End If
        
      'Get the chunk from the request object.
      bytThisChunk = m_objRequest.BinaryRead(CVar(lngChunkSize))
    
      'Initialize the value.
      lngBeginOfChunk = 1
      
      'Repeat until the end of the data.
      Do While Not blnEndOfData
        'Begin the chunk.
        lngBeginOfChunk = InStrB(lngBeginOfChunk, bytThisChunk, bytBeginOfChunk) + UBound(bytBeginOfChunk)
        
        'Get name of the item.
        lngBeginOfAttribute = InStrB(lngBeginOfChunk, bytThisChunk, bytBeginOfName) + UBound(bytBeginOfName) + 1
        lngEndOfAttribute = InStrB(lngBeginOfAttribute, bytThisChunk, bytEndOfName)
        bytName = MidB(bytThisChunk, lngBeginOfAttribute, lngEndOfAttribute - lngBeginOfAttribute)
        
        'Get the value of the item.
        lngBeginOfValue = InStrB(lngEndOfAttribute, bytThisChunk, bytBeginOfValue, vbBinaryCompare) + UBound(bytBeginOfValue) + 1
        lngEndOfValue = InStrB(lngBeginOfValue, bytThisChunk, bytEndOfValue, vbBinaryCompare)
        
        If lngEndOfValue = 0 Then
          'The item extends the past current chunk.
          bytValue = MidB(bytThisChunk, lngBeginOfValue, lngChunkSize)
        Else
          'The item value exists in the current chunk.
          bytValue = MidB(bytThisChunk, lngBeginOfValue, lngEndOfValue - lngBeginOfValue)
        End If
        
        If UCase(StrConv(bytName, vbUnicode)) = "FILE" Then
          lngBeginOfAttribute = InStrB(lngBeginOfChunk, bytThisChunk, bytBeginOfFile, vbBinaryCompare) + UBound(bytBeginOfFile) + 1
          lngEndOfAttribute = InStrB(lngBeginOfAttribute, bytThisChunk, bytEndOfFile, vbBinaryCompare)
          
          bytFileName = MidB(bytThisChunk, lngBeginOfAttribute, lngEndOfAttribute - lngBeginOfAttribute)
          
          If UBound(bytFileName) < 0 Or UBound(bytValue) < 0 Then
            Err.Raise ERR_INVALID_FILENAME, App.Title, "Invalid File Name."
          End If
          
          If Me.Target = "" Then
            Err.Raise ERR_INVALID_TARGET, App.Title, "Invalid Target."
          End If
          
          'Use the original file name.
          If Me.FileName = "" Then
          
            'Trim the path from the file name.
            While InStrB(1, bytFileName, StrConv("\", vbFromUnicode), vbBinaryCompare) > 0
              bytFileName = MidB(bytFileName, InStrB(1, bytFileName, StrConv("\", vbFromUnicode)) + 1)
            Wend
            
            'Set the property.
            Me.FileName = StrConv(bytFileName, vbUnicode)
            
            'Convert the byte to Unicode.
            strFileName = Me.Target & Me.FileName
           
          Else
            strFileName = Me.Target & Me.FileName
          End If
          
          'Check for overwrite.
          If Me.OverWrite Then
            'This is the hack check. Make sure that wildcard characters cannot be used.
            If Not InStr(1, strFileName, "*") Then
              If FileExists(strFileName) Then
                Kill strFileName
              End If
            Else
              Err.Raise ERR_INVALID_FILENAME, App.Title, "The specified file name appears to be invalid."
            End If
          Else
            If FileExists(strFileName) Then
              Err.Raise ERR_FILE_EXISTS, App.Title, "The file already exists."
            End If
          End If
          
          lngFileNum = FreeFile
          
          Open strFileName For Binary Access Write As #lngFileNum
          
          'Write the file to the destination directory.
          Put #lngFileNum, , bytValue
    
          'This chunk is empty. Therefore, get a new chunk.
          lngBytesLeft = m_objRequest.TotalBytes - lngChunkSize
            
          'Start the chunking machine.
          Do While lngBytesLeft > 0
          
            'Get a new chunk.
            bytThisChunk = m_objRequest.BinaryRead(CVar(lngChunkSize))
                      
              lngEndOfValue = InStrB(1, bytThisChunk, bytEndOfValue, vbBinaryCompare)
              
              If lngEndOfValue > 0 Then
                'The item value exists in the current chunk.
                bytThisChunk = MidB(bytThisChunk, 1, lngEndOfValue - 1)
              End If
              
              'Append the chunk to the file.
              Put #lngFileNum, , bytThisChunk
              
              lngBytesLeft = lngBytesLeft - lngChunkSize
              
              If lngBytesLeft < lngChunkSize Then
                lngChunkSize = lngBytesLeft
              End If
            Loop
            
            Close #lngFileNum
            
            TotalBytes = FileLen(strFileName)
            
         ' Exit Do
         Else
          If UCase(StrConv(bytName, vbUnicode)) = "SAVEAS" Then
           Me.FileName = StrConv(bytValue, vbUnicode)
          Else 
           'form field other than file, such as textboxes 
           If UBound(bytValue) > 0 And UBound(bytName) > 0 Then 
            m_formCol.Add StrConv(bytName, vbUnicode), StrConv(bytValue, vbUnicode)
           Else
            m_formCol.Add StrConv(bytName, vbUnicode), ""
           End If
          End If
         End If
        
        'Get the next chunk.
        lngBeginOfChunk = lngEndOfValue
        
        If InStrB(lngBeginOfChunk, bytThisChunk, bytBeginOfName, vbBinaryCompare) = 0 Then
          blnEndOfData = True
        End If
      Loop
    
      Uploaded = True
      
      Exit Sub
      
    UploadErr:
      
      If Err.Number = VB_ERR_PATH_NOT_FOUND Then
        Err.Raise ERR_INVALID_TARGET, App.Title, "The Target specified does not exist."
      Else
        Err.Raise Err.Number, Err.Source, Err.Description
      End If
    End Sub
    
    Public Property Get Form() As Collection
        Set Form = m_formCol
    End Property
    Public Property Get FileName() As String
      FileName = m_strFileName
    End Property
    
    Public Property Let FileName(ByVal strNewValue As String)
      If Uploaded Then
        Err.Raise ERR_UPLOAD_CALLED, App.Title, "The Upload method has already been called."
      Else
        m_strFileName = strNewValue
      End If
    End Property
    
    Public Property Get OverWrite() As Boolean
      OverWrite = m_blnOverWrite
    End Property
    
    Public Property Let OverWrite(ByVal blnNewValue As Boolean)
      If Uploaded Then
        Err.Raise ERR_UPLOAD_CALLED, App.Title, "The Upload method has already been called."
      Else
        m_blnOverWrite = blnNewValue
      End If
    End Property
    
    Private Property Get Uploaded() As Boolean
      Uploaded = m_blnUploaded
    End Property
    
    Private Property Let Uploaded(ByVal blnNewValue As Boolean)
      m_blnUploaded = blnNewValue
    End Property
    
    Public Property Get Target() As String
      Target = m_strTarget
    End Property
    
    Public Property Let Target(ByVal NewValue As String)
      If Uploaded Then
        Err.Raise ERR_UPLOAD_CALLED, App.Title, "The Upload method has already been called."
      Else
        m_strTarget = NewValue
      End If
    End Property
    
    Private Function FileExists(ByVal FileName As String) As Boolean
      On Error GoTo FileExistsErr
      
      FileLen FileName
      FileExists = True
      Exit Function
      
    FileExistsErr:
      If Err.Number = VB_ERR_PATH_NOT_FOUND Then
        FileExists = False
      End If
    End Function
    
    Public Property Get TotalBytes() As Long
      TotalBytes = m_lngTotalBytes
    End Property
    
    Private Property Let TotalBytes(ByVal NewValue As Long)
      m_lngTotalBytes = NewValue
    End Property
    
  9. Biên d?ch d? án

ASP Code

  1. Dán đo?n m? sau vào m?t tr?nh so?n th?o như Notepad ho?c Microsoft Visual Interdev, và sau đó lưu nó nhưPostFile.asp:
    <%@ Language=VBScript %>
    <html>
    <head>
    </head>
    <body>
    <form enctype="multipart/form-data" action="uploadfile.asp" method="post" name="main1">
    <input name="file" type="file" size="50">
    <INPUT type="text" id=text1 name=text1><INPUT type="text" id=text2 name=text2>
    <input name="submit" type="submit" value="Upload">
    </form>
    </body>
    </html>
    
  2. Copy đo?n m? sau vào m?t tr?nh so?n th?o như Notepad ho?c Tr?c quan Interdev, và sau đó lưu nó như UploadFile.asp:
    <%@ Language=VBScript %>
    <%
      '//////////////////////////////////////////////////////////////////////////////////
      '//  ASPFileUpload.File API
      '//  
      '//  Properties
      '//     FileName
      '//       - Read/Write 
      '//       - The file will be saved with this file name. 
      '//       - This property can only be set before calling Upload.
      '//       - If no value is specified, the original file name
      '//       - in the HTTP post will be used.
      '//     
      '//     OverWrite
      '//       - Read/Write
      '//       - This property can only be set before calling Upload.
      '//       - If set to false and if the destination file exists, an error
      '//       - is raised. The default value is False.
      '//     
      '//     Target 
      '//       - Read/Write
      '//       - The file will be written to this folder.
      '//       - This property can only be set before calling Upload.
      '//       - There is no default value for this property and it is required.
      '//       
      '//      Form
      '//        - ReadOnly
      '//        - Scripting.Dictionary object
      '//        - Can access a specific item by using aspfileupload.Form("item").
      '//        - Acts like the asp form collection.
      '//        - Can enumerate all values in a collection with for each.
      '//        - Only filled after the Upload method is called.
      '//         
      '//  Methods
      '//     Upload
      '//       - This method parses the HTTP Post and writes the file.
      '//  
      '//  Other
      '//    - ASPFileUpload requires COM+
      '//    - Any call to the Request.Form() collection will cause the Upload
      '//      method to fail as the method references the Binary contents of the
      '//      Request object through the Request.BinaryRead method. 
      '//    - Also, if you access a variable in the Request collection without 
      '//      specifying the subcollection that it belongs to, the Request.Form collection 
      '//      may be searched. This causes an error in the Upload method.
      '//      
      '//////////////////////////////////////////////////////////////////////////////////
      
      Dim strMsg 'As String
      
     ' On Error Resume Next
      dim fuFile
      set fuFile = server.CreateObject("aspFileupload.file")  
      'Set the destination folder.
      fuFile.Target = "C:\TEMP\AspFileUpload\"
      fuFile.Upload
      
      If Err.number = 0 Then
        strMsg = fuFile.FileName  & " was uploaded successfully."
      Else
        strMsg = "An error occurred when uploading your file: " & Err.Description 
      End If
      for each o in fuFile.Form
    	Response.Write o  & "<BR>"
    	
    	next
    	
    	Response.Write fuFile.Form.item("text1") & "  :  " & fuFile.Form.item("text2")
    '  Response.Write Request.Form("test")
     set fufile = nothing
    %>
    <html>
    <head></head>
    <body>
    <%=strMsg%>
    </body>
    </html>

Thi?t l?p máy ch?

  1. T?o m?t thư m?c trên máy ch? Web đó s? nh?n đư?c các t?i lên t?p tin, ch?ng h?n nhưC:\TEMP\AspFileUpload.
  2. Sao chép các t?p tin ASPFileUpload.dll vào máy ch? Web, và sau đó đăng k? nó b?ng cách s? d?ng l?nh sau t?i d?u nh?c l?nh:
    regsvr32 PathToDLL\ASPFileUpload.dll
  3. Áp d?ng t?p c?p phép (Write access) cho nh?ng ngư?i b?n mu?n đ? có th? t?i lên các t?p tin s? d?ng.
  4. Nh?p vào B?t đ?u, đi?m đ?nThi?t đ?t, sau đó b?m Ki?m soát B?ng đi?u khi?n.
  5. Trong b?ng đi?u khi?n, nh?p vào Hành chính Công c?, sau đó b?m Thành ph?n d?ch v? đ? m? Thành ph?n d?ch v? trong Microsoft Management Console (MMC).
  6. M? r?ng các Thành ph?n d?ch v? nút, cácMáy vi tính nút, các Máy tính c?a tôi nút, và cácCOM + các ?ng d?ng nút.
  7. Nh?p chu?t ph?i vào nút, đi?m đ?n M?i, sau đó b?m?ng d?ng.
  8. Trong các Cài đ?t ho?c t?o ra m?t ?ng d?ng m?i h?p tho?i h?p, b?m vào T?o m?t ?ng d?ng có s?n ph?m nào, tên ?ng d?ng, h?y ch?c ch?n r?ng b?n b?m đ? ch?n H? ph?c v? ?ng d?ng, sau đó b?m Ti?p theo.
  9. Trong các Đ?t ?ng d?ng nh?n d?ng h?p tho?i h?p, b?m vào Ngư?i dùng này, và sau đó nh?p ?y nhi?m cho các trương m?c ngư?i dùng thích h?p. Trương m?c ngư?i dùng ph?i có quy?n truy c?p ghi vào thư m?c mà s? nh?n đư?c các t?p tin đư?c t?i lên.
  10. Nh?p vào K?t thúc.
  11. M? r?ng nút mà b?n đ? t?o này ?ng d?ng.
  12. Nh?p chu?t ph?i vào g?t, đi?m đ?n M?i, và sau đó b?m Thành ph?n.
  13. Nh?p vào Cài đ?t các thành ph?n m?i, và xác đ?nh v? trí thư m?c nơi b?n đ? lưu và đăng k? .dll t?p, b?m các t?p tin, nh?p vào Ti?p theo, sau đó b?mK?t thúc.
  14. Sao chép các t?p tin Postfile.asp và các t?p tin Uploadfile.asp Web thư m?c g?c c?a b?n. Theo m?c đ?nh, thư m?c g?c c?a trang Web là C:\Inetpub\Wwwroot.
  15. Ch?nh s?a thư m?c đích c?a Uploadfile.asp đ? ph?n ánh các thư m?c mà b?n đ? t?o ? bư?c 1. Phân công c?p đích là th? d?ng m? sau đây:
    fuFile.Target = "C:\TEMP\AspFileUpload\"
    					

G?i tác ph?m

  1. Tr?nh duy?t Web, m? trang Postfile.asp ? các URL sau:
    http://YourWebServer/Postfile.asp
  2. Ch?n m?t t?p tin mà b?n mu?n t?i lên, và sau đó nh?p vàoT?i lên.
  3. Ki?m tra thư m?c t?i lên c?a b?n. Các t?p tin mà b?n t?i lên s? xu?t hi?n trong c?p này.

Gi?i đáp th?c m?c

  • N?u b?n không ph?i g? tên t?p, và n?u b?n c? g?ng g?i các trang Postfile.asp, b?n nh?n đư?c m?t thông báo l?i chung chung, phía máy ch?. B?n có th? mu?n thay đ?i m? đ? cung c?p m?t thông báo l?i thân thi?n hơn vào m?t khách hàng bên ho?c v? phía máy ch?.
  • N?u b?n yêu c?u s? lư?ng l?n t?i lên năng l?c, Microsoft khuy?n cáo b?n mua ho?c xây d?ng m?t thành ph?n biên so?n, multithreaded có th? nhi?u hi?u qu? x? l? t?i hơn này thành ph?n Visual Basic.
  • M?t nguy cơ b?o m?t ti?m năng t?n t?i b?t c? khi nào b?n cho phép ngư?i dùng đ? t?i lên t?p tin vào máy ch? Web c?a b?n. Đi?u này đ?c bi?t đúng n?u máy ch? c?a b?n trên Internet, và n?u b?n cho phép chưa xác đ?nh ngư?i t?i lên. B?n ph?i chính xác c?u h?nh c?p phép Windows và IIS ngư?i dùng xác th?c đ? đ?m b?o r?ng b?n cung c?p cho ngư?i s? d?ng ch? truy c?p mà h? yêu c?u. Đi?u này là quan tr?ng đ? b?n không cho phép ngư?i dùng m?t cách đ? đư?c truy c?p b?i b? qua ki?m soát an ninh c?a b?n h? th?ng.

Thu?c tính

ID c?a bài: 299692 - L?n xem xét sau cùng: 04 Tháng Giêng 2012 - Xem xét l?i: 2.1
Áp d?ng
  • Microsoft Active Server Pages 4.0
  • Microsoft Internet Information Services 5.0
T? khóa: 
kbaspobj kbcodesnippet kbconfig kbdeployment kbfile kbfso kbguidelines kbhowto kbsample kbscript kbsecurity kbserver kbsetup kbwebserver kbmt KB299692 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:299692

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com