2011-06-28 18 views
5

He desarrollado una página segura en ASP para la empresa para la que trabajo. Hay un aterrizaje (página de inicio de sesión) que una vez que se autentica se lo lleva a una página que tiene enlaces a varias páginas secundarias. Cada subpagina tiene una estructura de carpeta. Por ejemplo: hay un encabezado para Minutas de la reunión y luego debajo y sangría son enlaces que hacen referencia a archivos PDF que contienen la información. Puede haber 3 o 4 encabezados con documentos vinculados debajo.Enumerar una estructura de carpetas en ASP clásico

La versión original tenía un script PHP que se ejecutaba y sincronizaba el sitio en vivo en el servidor desde una estructura de carpetas que se imitaría en el sitio en vivo. Entonces, si tuviera una carpeta llamada Carpeta1 y subcarpetas llamadas test1 test2 test3 ... el sitio en vivo las mostraría en consecuencia. Como el sitio ahora está en ASP y no en PHP ... el script PHP ya no funciona (ya que PHP no funciona bien con ASP).

Encontré un fragmento en línea que funciona de alguna manera para lo que estoy tratando de lograr (es decir, carpeta/subcarpeta/estructura de nombre de archivo), sin embargo estoy atascado en este momento con cómo vincular los archivos para que se abran al hacer clic . Sigo viendo un% 25 en el nombre del archivo. Sé que% 20 es lo mismo que un espacio en blanco y como estoy tratando con nombres de archivos y carpetas que contienen espacios, este parece ser mi problema. Intenté agregar un% 20 pero los espacios se convierten en "% 2520".

Si mira el siguiente código, hay un enlace hacia la parte inferior que llama "MapURL". Tengo ese enlace comentado en este momento ya que estaba tratando de averiguar de dónde venía el% 25. ¿Alguien tiene alguna idea sobre cómo hacer que los enlaces funcionen?

Aquí está el fragmento.

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 

Respuesta

2

es probable que tenga cotizaciones adicionales a href (""). La mejor manera es ver el código fuente generado (de la página resultante) como <a href=""" & replace(...) & """>"
Básicamente, si usa solo una cita, simplemente cierra la cadena, pero le falta la cita HTML necesaria después de href = y la de cierre.

+0

Gracias Rodolfo! Eso lo hizo. Apreciar la respuesta rápida! – Nick

5

Hay varias cosas incorrectas con su código.

  • Primero y ante todo, que no codifican los valores de salida en absoluto. Este es un gran error. Faltan URL que codifica para las cosas que entran en el atributo HREF, y omite codificación HTML para todo lo demás.
  • A continuación, crea un nuevo FileSystemObject con cada llamada a la función recursiva ListFolderContents(). Esto es un desperdicio innecesario y se volverá lento tan pronto como haya más de un puñado de archivos para enviar.
  • Su función recursiva debería tomar un objeto Folder como primer argumento, no como una ruta. Esto hace las cosas mucho más fáciles.
  • La estructura HTML que muestra no es válida. <b> legalmente no es un hijo de <ul>.

Reescribí completamente el código para producir la salida más correcta y para ser lo más rápido posible. Es crucial para su problema la función PathEncode(), que transforma una ruta relativa a una URL codificada correctamente.Las otras cosas deben ser bastante explica por sí mismo:

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 

Notas

  • Uso del <div class="folder"> para aplicar estilos CSS (es decir, etc. negrita) con el nombre de la carpeta.
  • La función no generará archivos o directorios ocultos.
  • El argumento relativePath se usa para mantener la carga de trabajo lo más baja posible: cuando una carpeta tiene 1000 archivos, no tiene sentido calcular toda la ruta relativa de 1000 veces. Con la ayuda de este parámetro, solo se procesa la parte que en realidad cambia .
  • Tener funciones como Say() o h() puede ahorrarle mucha escritura y también mantiene el código más limpio.
  • Debe leer sobre la codificación URL (y la codificación HTML también). Parece que nunca te has encontrado con estas cosas, , lo cual es especialmente malo si tu tarea es construir un sitio seguro.