3

我在这个网站上没有 apache 支持,但我需要能够只允许在某个目录中下载图像。我怎样才能做到这一点?这个站点只有 ASP.NET 支持,这让我很生气!注意到这个链接: 如何在 mvc3 中下载文件?但不确定将代码放在哪里,或者即使那里的代码对我有任何帮助。

任何帮助将不胜感激!起点什么的...

有没有办法我可以在 HTML 中做到这一点?例如,将下载链接设置为指向一个 html 文件,HTML 文件会在其中抓取图像文件并使其本身可下载?

到目前为止,我在一个名为 default.asp 的文件中有以下 ASP 代码

开始下载就好了,但它下载了一个空文件(download.jpg)。如何将以下代码指向要下载的实际图像文件?

<%@ Language=VBScript %>
<%  Option Explicit

Response.ContentType = "application/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=" + "download.jpg"

%>

即使在同一目录中,我也有一个名为“download.jpg”的文件,但它从不下载实际图像。它会下载一个 90 字节的空图像文件。

我什至没有运气尝试过:

<%@ Language=VBScript %>
<%  Option Explicit

Response.ContentType = "application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=07awardee.png"
Response.TransmitFile Server.MapPath("~/images/07awardee.png")
Response.End

%>

是的,我在服务器根目录的 images/07awardee.png 甚至在 default.asp 所在的文件夹根目录中都有 07awardee.png 文件。阿格!这里给出了什么?该文件现在有点大,为 392 字节,但它仍然无法作为图像文件读取......我一直在搜索互联网,这应该可以工作,但没有!这里可能是什么问题?

4

3 回答 3

2

带有 Request.End 的 .aspx 页面会引发 ThreadAbortException,这对服务器性能不利(其中太多甚至会导致服务器崩溃)。所以你要避免这种情况。http://weblogs.asp.net/hajan/archive/2010/09/26/why-not-to-use-httpresponse-close-and-httpresponse-end.aspx

我处理这个问题的方法是使用 HttpHandler (.ashx) 并使用它来提供可下载的图像文件。我使用了您的一些代码,因为我的实现是在 C# 中并且有更多代码(包括图像缩放选项等):

//<%@ WebHandler Language="VB" Class="DownloadImage" %> // uncomment this line!

Public Class DownloadImage : Implements IHttpHandler
  Protected EnabledTypes() As String = New String() {".jpg", ".gif", ".png"}

  Public Sub ProcessRequest(ByVal context As HttpContext) _
    Implements IHttpHandler.ProcessRequest
    Dim request = context.Request
    If Not String.IsNullOrEmpty(request.QueryString("file")) Then
      Dim path As String = context.Server.MapPath(request.QueryString("file"))
      Dim file As System.IO.FileInfo = New System.IO.FileInfo(path)
      If file.Exists And EnabledTypes.Contains(file.Extension.ToLower()) Then
        context.Response.Clear()
        context.Response.AddHeader("Content-Disposition", _
            "attachment; filename=" & file.Name)
        context.Response.AddHeader("Content-Length", file.Length.ToString())
        context.Response.ContentType = "application/octet-stream"
        context.Response.WriteFile(file.FullName) 
      Else
        context.Response.ContentType = "plain/text"
        context.Response.Write("This file does not exist.") 
      End If
    Else
      context.Response.Write("Please provide a file to download.")
    End If
  End Sub

  Public ReadOnly Property IsReusable() As Boolean _
        Implements IHttpHandler.IsReusable
    Get
        Return True
    End Get
  End Property
End Class

确保您对图像文件实施检查,否则您会遇到潜在的安全问题。(用户可以下载存储数据库密码的 web.config)

该链接将变为:

<a href="/DownloadImage.ashx?file=/images/logo.gif">Download image</a>
于 2013-05-31T12:03:56.773 回答
1

您应该清除标题并提供正确的标题和内容类型

Response.Clear()
Response.AppendHeader("Content-Disposition", "attachment; filename=somefilename")
Response.ContentType = "image/jpeg"
Response.TransmitFile(Server.MapPath("/xyz.jpg"));
Response.End();
于 2013-05-27T11:25:12.113 回答
1

天哪,我摇滚。这是完成的方式。创建一个名为 download.aspx 的文件,并在其中输入以下代码:

<%@ Page language="vb" runat="server" explicit="true" strict="true" %>
<script language="vb" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
    Dim strRequest As String = Request.QueryString("file")
    If strRequest <> "" AND strRequest.EndsWith(".jpg") OR strRequest.EndsWith(".jpeg") OR strRequest.EndsWith(".png") OR strRequest.EndsWith(".gif") OR strRequest.EndsWith(".pdf") OR strRequest.EndsWith(".doc") OR strRequest.EndsWith(".docx") OR strRequest.EndsWith(".bmp") Then
        Dim path As String = Server.MapPath(strRequest)
        Dim file As System.IO.FileInfo = New System.IO.FileInfo(path)
        If file.Exists Then
            Response.Clear()
            Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name)
            Response.AddHeader("Content-Length", file.Length.ToString())
            Response.ContentType = "application/octet-stream"
            Response.WriteFile(file.FullName)
            Response.End
        Else
            Response.Write("This file does not exist.")
        End If
    Else
        Response.Write("You do not have permission to download this file type!")
    End If
End Sub
</script>

现在,当您想要下载文件(任何文件)时,只需像这样链接它:

<a href="download.aspx?file=/images/logo.gif">Download the logo image</a>

这就是她写的全部内容!

于 2013-05-28T01:53:50.437 回答