打开“另存为”对话框要下载图片(Open “Save As” Dialog Box To Downl

2019-10-19 15:38发布

我已经检查各地的答案,这一个,但没有运气的地方。

我想要一个按钮或链接,将打开“另存为”对话框。 简单?

我知道我可以在新窗口/选项卡中打开的图像(因为我现在做的),然后用right-click, save as的方法,但由于使用这个人是不是在框中锐利的刀,所以我想使下载尽可能简单。

目前的代码是:

<button class="downloadButton" type="submit" onClick="window.open('<%=(rsContent.Fields.Item("ContentImage").Value)%>')">Download Image</button>

但这将图像加载到一个新的窗口/新标签。

只是为了记录在案,用户使用的是Windows XP的Internet Explorer 8,所以我们不能用download HTML5事件。

我不介意它的JavaScript,JQuery的或传统的ASP。

先谢谢您的帮助。

UPDATE

使用MDN代码Lankymart贴,我想作为,是和它的工作(对于Excel文档的打开/下载),但是,我试图改变部分下载图片,并没有奏效。

这里是传统的ASP代码:

<%
Dim rsImage__imageID
rsImage__imageID = "1"
If (Request.QueryString("imageID")  <> "") Then 
  rsImage__imageID = Request.QueryString("imageID") 
End If
%>
<%
Dim rsImage
Dim rsImage_cmd
Dim rsImage_numRows

Set rsImage_cmd = Server.CreateObject ("ADODB.Command")
rsImage_cmd.ActiveConnection = MM_ENG_STRING
rsImage_cmd.CommandText = "SELECT ContentID, ContentImage, DisplayImage FROM tblContent WHERE ContentImage = ?" 
rsImage_cmd.Prepared = true
rsImage_cmd.Parameters.Append rsImage_cmd.CreateParameter("param1", 5, 1, -1, rsImage__imageID) ' adDouble

Set rsImage = rsImage_cmd.Execute
rsImage_numRows = 0
%>

和(严重)改变MDN代码:

<%
'Set the content type to the specific type that you are sending.
Response.ContentType = "image/JPEG"

Const adTypeBinary = 1
Dim strImageFile

strImageFile = (rsImage.Fields.Item("ContentImage").Value) 'This is the path and name of the file on disk. 

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strImageFile

Response.BinaryWrite objStream.Read

objStream.Close
Set objStream = Nothing
%>

我把它用:

<button class="downloadButton" type="submit" onClick="window.location.href='image-download.asp?imageID=<%=(rsContent.Fields.Item("ContentID").Value)%>';">Download Image</button>

它产生的错误是:

The image “http://localhost:85/admin/english/image-download.…p?imageID=5” cannot be displayed because it contains errors.

该页面的代码是:

<html>

    <head>
        <meta name="viewport" content="width=device-width; height=device-height;"></meta>
        <link rel="stylesheet" href="resource://gre/res/ImageDocument.css"></link>
        <link rel="stylesheet" href="resource://gre/res/TopLevelImageDocument.css"></link>
        <link rel="stylesheet" href="chrome://global/skin/media/TopLevelImageDocument.css"></link>
        <title>

            image-download.asp (JPEG Image)

        </title>
    </head>
    <body>
        <img src="http://localhost:85/admin/english/image-download.asp?imageID=5" alt="The image “http://localhost:85/admin/english/image-download.…p?imageID=5” cannot be displayed because it contains errors." title=""></img>
    </body>

</html>

Answer 1:

您可以创建一个按钮,指向链接图像返回为一个文件,它会显示保存选项自动代替导航到另一个页面。

在服务器端,指定mime类型为application /八位字节流



Answer 2:

更新 -在问题相关评论

您也可以找到你需要包括

Response.AddHeader("Content-Length", LenB(yourbinary))

为了从未能验证有效载荷阻止一些浏览器。 另外很重要的的ContentType匹配,如果你不确定什么用发送

Response.Content = "application/octet-stream"

有没有办法从浏览器启动另存为对话框通过JavaScript,但你可以伪造的浏览器变成通过设置显示另存为对话框attachment在价值Content-Disposition HTTP标头。

我解决这个问题的方法是使用一个ASP页面,生成图像(通过COM组件,ADODB.Stream,数据库BLOB等),这样就可以使用;

Response.AddHeader("Content-Disposition", "attachment;filename=myimage.jpg")

这将迫使图像进行保存,而不是内嵌方式显示。 因此,与这样的脚本,您可以通过一个查询字符串值,其显示嵌入式(查看影像时),一个迫使它作为附件,这将迫使另存为对话框(浏览器的行为可能略有不同)。

分流到浏览器

使用ADODB.Stream对象文件输出到浏览器。

  • 返回用ASP,不.NET的图像 (的StackOverflow)
  • 如何使用ADODB.Stream对象通过ASP到二进制文件发送到浏览器 (Microsoft支持)。

在过去,我已经开始另存为使用JavaScript对话框(但没有什么使用HTML锚标记做没有任何JavaScript同样的事情阻止你);

/* 
passing myimageid is a way of identifying the image to return 
be it a database or file system lookup.
*/
window.location.href = "/myimage.asp?id=myimageid&display=attachment";

因为与从传递的文件的名称立即显示的对话框响应返回作为附件的位置从来没有真正改变,保存Content-Disposition在文件名框中HTTP标头。



文章来源: Open “Save As” Dialog Box To Download Image