打开"另存为"对话框下载图像

时间:2014-03-24 14:18:49

标签: javascript jquery html asp-classic

我一直在检查这个地方的答案,但没有运气。

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

我知道我可以在新的窗口/标签中打开图像(正如我现在所做的那样),然后使用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。

提前感谢您的帮助。

更新

使用发布的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>

2 个答案:

答案 0 :(得分:2)

您可以创建一个指向链接的按钮,该链接将图像作为文件返回,它将自动显示保存选项,而不是导航到另一个页面。

在服务器端,将mime类型指定为application / octect-stream

答案 1 :(得分:2)

更新 - 与问题中的评论相关

您可能还会发现需要包含

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

阻止某些浏览器无法验证有效负载。同样重要的是ContentType匹配发送的内容,如果您不确定使用

Response.Content = "application/octet-stream"

无法通过javascript从浏览器启动“另存为”对话框,但您可以通过在attachment HTTP标头中设置Content-Disposition值来伪装浏览器以显示“另存为”对话框。 / p>

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

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

这将强制保存图像而不是内联显示。因此,使用这样的脚本,您可以向其传递一个查询字符串值以显示内联(在查看图像时),并将其强制为附件,这将强制“另存为”对话框(浏览器行为可能略有不同)。

  

流式传输到浏览器

     

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

     

过去我曾使用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标头传递的文件名。