Denna klass låter dig ladda ned filer utanför webbroten. Inga begränsningar finns på filstorlek eller antalet nedladdningar.
Används på följande vis:
HttpFile.SecureFileDownload("c:\filnamn.txt")
Eller om du vill specifiera ett eget filnamn som visas för klienten:
HttpFile.SecureFileDownload("c:\filnamn.txt", "nyttfilnamn.txt")
Imports System
Imports System.IO
Imports System.Web
Imports System.Web.UI
Namespace BackendMedia.Web
[blue]''' <summary>
''' Hanterar http-anslutningar till lokala filer på webbservern.
''' </summary>[/blue]
Public Class HttpFile
[blue]''' <summary>
''' Laddar ned fil till klienten.
''' </summary>
''' <remarks>
''' Filen skickas i ContentType <c>application/octet-stream</c>, vilket tvingar klienten att ladda ned filen
''' i stället för att låta användarens inställningar välja om den ska laddas ned eller öppnas direkt.
''' </remarks>
''' <param name="SourceFile">
''' Fullständig sökväg till fil som ska laddas ned. Exempelvis <c>c:\temp\file.txt</c>.
''' </param>[/blue]
Public Shared Sub SecureFileDownload(ByVal SourceFile As String)
[blue]' Välj rätt namn på filen.[/blue]
Dim fi As FileInfo = New FileInfo(SourceFile)
Dim FileName As String = fi.Name
MyBase.SecureFileDownload(SourceFile, FileName)
End Sub
[blue]''' <summary>
''' Laddar ned fil till klienten.
''' </summary>
''' <remarks>
''' Filen skickas i ContentType <c>application/octet-stream</c>, vilket tvingar klienten att ladda ned filen
''' i stället för att låta användarens inställningar välja om den ska laddas ned eller öppnas direkt.
''' </remarks>
''' <param name="SourceFile">
''' Fullständig sökväg till fil som ska laddas ned. Exempelvis <c>c:\temp\file.txt</c>.
''' </param>
''' <param name="FileName">
''' Namn på filen som ska skicka till klienten. Ett annorlunda namn kan exempelvis anges om
''' originalfilen heter <c>original.txt</c>, men kan laddas ned som <c>annat-filnamn.txt</c>.
''' </param>[/blue]
Public Shared Sub SecureFileDownload(ByVal SourceFile As String, ByVal FileName As String)
Dim oFileStream As FileStream
Dim lFileSize As long, lStartpos = 0
[blue]' Fånga eventuella fel.[/blue]
Try
oFileStream = New FileStream(SourceFile, FileMode.Open)
Catch ex As FileNotFoundException
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.Write("Filen kunde inte hittas.")
HttpContext.Current.Response.End()
Return
Catch Ex As Exception
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.Write(String.Format("Ett fel uppstod: {0}", ex.Message))
HttpContext.Current.Response.End()
Return
End Try
[blue]' Läs in filens innehåll.[/blue]
lFileSize = oFileStream.Length
Dim bBuffer(cInt(lFileSize)) As Byte
oFileStream.Read(bBuffer, 0, cType(lFileSize, Integer))
oFileStream.Close()
[blue]' Slanga ut filen.[/blue]
With HttpContext.Current.Response
.ClearContent()
.AddHeader("Content-Type", "application/octet-stream")
.AddHeader("Content-Disposition", "attachment; filename=""" & FileName & """")
.BinaryWrite(bBuffer)
End With
[blue]' Viktigt att stänga filströmmen, annars låses den av processen.[/blue]
oFileStream.Close()
End Sub
End Class
End Namespace