2011-06-28 55 views
5

Tôi đã phát triển một trang bảo mật trong ASP cho công ty mà tôi làm việc cho. Có một trang đích (trang đăng nhập) khi bạn đã được xác thực, bạn sẽ được đưa đến trang có liên kết đến một số trang phụ. Mỗi trang phụ có cấu trúc thư mục. Ví dụ: Có một tiêu đề cho Biên bản cuộc họp và sau đó bên dưới và thụt lề là các liên kết tham chiếu đến các tệp PDF chứa thông tin. Có thể có 3 hoặc 4 tiêu đề với các tài liệu được liên kết bên dưới.Liệt kê cấu trúc thư mục trong Classic ASP

Phiên bản gốc có tập lệnh PHP chạy và đồng bộ hóa trang web trực tiếp trên máy chủ từ cấu trúc thư mục được bắt chước trên trang web trực tiếp. Vì vậy, nếu tôi có một thư mục có tên Folder1 và các thư mục con có tên test1 test2 test3 .. trang web trực tiếp sẽ hiển thị chúng cho phù hợp. Kể từ khi trang web hiện tại trong ASP và không PHP .. PHP script không còn hoạt động (kể từ khi PHP không chơi tốt với ASP).

Tôi tìm thấy một đoạn trích trực tuyến có phần hoạt động cho những gì tôi đang cố gắng đạt được (ví dụ: Cấu trúc thư mục/thư mục con/tên tệp), tuy nhiên tôi đang bị kẹt vào lúc này. . Tôi tiếp tục nhìn thấy một% 25 trong tên tập tin. Tôi biết% 20 là giống như một không gian trống và kể từ khi tôi đang đối phó với tên tập tin và thư mục có chứa không gian, điều này dường như là vấn đề của tôi. Tôi đã thử thêm vào% 20 nhưng không gian trở thành "% 2520".

Nếu bạn nhìn vào mã bên dưới, có một liên kết ở phía dưới gọi "MapURL". Tôi có liên kết đó nhận xét vào lúc này vì tôi đang cố gắng tìm ra nơi mà% 25 đến từ đó. Bất cứ ai có bất kỳ suy nghĩ về cách để có được các liên kết để làm việc?

Đây là đoạn trích.

dim path 
path = "PATH TO THE FOLDER ON THE SERVER" 

ListFolderContents(path) 

sub ListFolderContents(path) 

dim fs, folder, file, item, url 
set fs = CreateObject("Scripting.FileSystemObject") 
set folder = fs.GetFolder(path) 

'Display the target folder and info. 

Response.Write("<ul><b>" & folder.Name & "</b>") '- " _ 
' & folder.Files.Count & " files, ") 
'if folder.SubFolders.Count > 0 then 
' Response.Write(folder.SubFolders.Count & " directories, ") 
'end if 
'Response.Write(Round(folder.Size/1024) & " KB total." _ 
' & "</ul>" & vbCrLf) 

Response.Write("<ul>" & vbCrLf) 

'Display a list of sub folders. 

for each item in folder.SubFolders 
    ListFolderContents(item) 
next 

'Display a list of files. 

for each item in folder.Files 
    'url = MapURL(item.path) 
    'Response.Write("<li><a href=" & url & ">" & item.Name & "</a> - " _ 

    Response.Write("<li><a href=" & Replace(item.path," ","%") & ">" & item.Name & "</a> - " _ 
    & item.Name & "</a>" _ 
    & "</li>" & vbCrLf) 
next 

Response.Write("</ul>" & vbCrLf) 
Response.Write("</ul>" & vbCrLf) 

end sub 

function MapURL(path) 

dim rootPath, url 

'Convert a physical file path to a URL for hypertext links. 

rootPath = Server.MapPath("/") 
url = Right(path, Len(path) - Len(rootPath)) 
MapURL = Replace(url, "\", "/") 

end function 

Trả lời

2

bạn có thể cần thêm dấu ngoặc kép tại href (""). Cách tốt nhất là xem mã nguồn được tạo ra (từ trang kết quả) như <a href=""" & replace(...) & """>"
Về cơ bản, nếu bạn chỉ sử dụng một trích dẫn, nó chỉ đóng chuỗi, nhưng bạn thiếu câu lệnh HTML cần thiết sau href = và giá đóng.

+0

Cảm ơn Rodolfo! Điều đó đã làm điều đó. Đánh giá cao phản hồi nhanh! – Nick

5

Có một vài điều sai với mã của bạn.

  • Trước tiên, bạn không mã hóa các giá trị bạn xuất tại tất cả. Đây là một sai lầm lớn. Bạn đang thiếu Mã hóa URL cho những thứ đi vào thuộc tính HREF và bạn bỏ lỡ Mã hóa HTML cho mọi thứ khác.
  • Tiếp theo, bạn tạo một FileSystemObject mới với mọi cuộc gọi đến hàm đệ quy ListFolderContents(). Điều này là không cần thiết lãng phí và sẽ trở nên chậm ngay khi có nhiều hơn một số tập tin được xuất ra.
  • Hàm đệ quy của bạn phải lấy đối tượng Folder làm đối số đầu tiên, chứ không phải đường dẫn. Điều này làm cho mọi thứ trở nên dễ dàng hơn nhiều.
  • Cấu trúc HTML mà bạn xuất không hợp lệ. <b> không thể hợp pháp là con của <ul>.

Tôi viết lại hoàn toàn mã của bạn để tạo ra kết quả chính xác hơn và nhanh nhất có thể. Quan trọng đối với vấn đề của bạn là chức năng PathEncode(), nó biến đổi đường dẫn tương đối thành URL được mã hóa chính xác.Những điều khác nên được khá tự giải thích:

ListFolder "P:\ATH\TO\THE\FOLDER\ON\THE\SERVER" 

' -- Main Functions ---------------------------------------------------- 
Sub ListFolder(path) 
    Dim fs, rootPath 

    Set fs = CreateObject("Scripting.FileSystemObject") 
    rootPath = Replace(path, Server.MapPath("/"), "") & "\" 

    ListFolderContents fs.GetFolder(path), PathEncode(rootPath) 
End Sub 

' ---------------------------------------------------------------------- 
Sub ListFolderContents(folder, relativePath) 
    Dim child 

    Say "<ul>" 
    Say "<li><div class=""folder"">" & h(folder.Name) & "</div>" 

    For Each child In folder.SubFolders 
    If Not IsHidden(child) Then 
     ListFolderContents child, relativePath & PathEncode(child.Name) & "/" 
    End If 
    Next 

    relativePath = h(relativePath) 

    For Each child In folder.Files 
    If Not IsHidden(child) Then 
     Say "<li><a href=""" & relativePath & h(PathEncode(child.Name)) & """>" & h(child.Name) & "</a></li>" 
    End If 
    Next 

    Say "</ul>" 
End Sub 

' -- Helper Functions/Shorthands --------------------------------------- 
Sub Say(s) 
    Response.Write s & vbNewLine 
End Sub 

Function h(s) 
    h = Server.HTMLEncode(s) 
End Function 

Function PathEncode(s) 
    ' this creates a more correct variant of what Server.URLEncode would do 
    PathEncode = Replace(s, "\", "/") 
    PathEncode = Server.URLEncode(PathEncode) 
    PathEncode = Replace(PathEncode, "+", "%20") 
    PathEncode = Replace(PathEncode, "%2F", "/") 
    PathEncode = Replace(PathEncode, "%2E", ".") 
    PathEncode = Replace(PathEncode, "%5F", "_") 
End Function 

Function IsHidden(File) 
    IsHidden = File.Attributes And 2 = 2 
End Function 

Ghi chú

  • Sử dụng <div class="folder"> để áp dụng phong cách CSS (ví dụ, vv đậm) với tên thư mục.
  • Chức năng sẽ không xuất các tệp hoặc thư mục ẩn.
  • Đối số relativePath được sử dụng để duy trì khối lượng công việc càng thấp càng tốt - khi một thư mục có 1000 tệp, sẽ không có ý nghĩa khi tính tổng số đường dẫn tương đối 1000 lần. Với sự trợ giúp của tham số này, chỉ một phần thực sự là thay đổi được xử lý.
  • Có các chức năng như Say() hoặc h() xung quanh có thể giúp bạn tiết kiệm rất nhiều đánh máy và nó cũng giữ mã sạch hơn.
  • Bạn cũng nên đọc mã hóa URL (và mã hóa HTML). Có vẻ như bạn chưa bao giờ gặp những thứ này, , đặc biệt là xấu nếu nhiệm vụ của bạn là xây dựng một trang web an toàn.
Các vấn đề liên quan