Если создать обработчик, скажем, «DownloadDoc .ashx», и использовать этот код:
Option Infer On
Imports System.IO
Imports System.Web
Imports System.Web.Services
''' <summary>
''' Return a pdf document.
''' </summary>
''' <remarks></remarks>
Public Class DownloadDoc
Implements System.Web.IHttpHandler
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim srcDir As String = "~/pdfs"
Dim fileType As String = ".pdf"
Dim fname = context.Request.QueryString("name")
Dim actualFile = Path.Combine(context.Server.MapPath(srcDir), fname & suffix) & fileType
If File.Exists(actualFile) Then
context.Response.ContentType = "application/octet-stream"
context.Response.AddHeader("Content-Disposition", "attachment; filename=""" & Path.GetFileName(actualFile) & """")
context.Response.TransmitFile(actualFile)
Else
context.Response.Clear()
context.Response.TrySkipIisCustomErrors = True
context.Response.StatusCode = 404
context.Response.Status = "404 Not Found"
context.Response.Write("<html><head><title>404 - File not found</title><style>body {font-family: sans-serif;}</style></head><body><h1>404 - File not found</h1><p>Sorry, that file is not available for download.</p></body></html>")
context.Response.End()
End If
End Sub
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
Затем вы можете использовать обычный <a href="http://www.example.com/DownloadDoc.ashx?name=mypdf">
.
Обратите внимание, что расширение «.pdf» принудительно, так что его нельзя отменить для загрузки произвольных файлов с сервера. Вы также можете убедиться, что присутствует только имя файла и ничего, что позволяет обход каталога, на всякий случай, если права доступа к файлу не установлены безопасно на сервере.
Установка context.Response.ContentType = "application/octet-stream"
самая близкая вы можете сделать, чтобы браузер предлагал файл для загрузки, а не отображал его.
Редактировать: О, извините, вы хотели C#. Я уверен, что вы сможете перевести вышеизложенное.
Тогда вы, возможно, испортились. Откройте их вручную один за другим, чтобы узнать, какой из них поврежден. –
Не делайте 'this.Response.End();'. –
Где у вас есть этот код? Возможно, есть другие данные, которые также отправляются, если у вас есть это в веб-форме. Это должно быть внутри обработчика – Aristos