正在将文件写入HttpResponse,浏览器未提示保存

Writing file to HttpResponse, browser not prompting to save

本文关键字:浏览器 提示 保存 HttpResponse 文件      更新时间:2023-09-26

我有一个带有IHttpHandler的ashx文件。当我将一些数据POST到此IHttpHandler时,我会做一些工作,创建一个文件,然后希望将该文件返回给用户,以便他们可以通过浏览器保存该文件。

创建文件后,这就是我尝试将文件写回响应的方式:

HttpResponse response = context.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT");
response.WriteFile("C:'tempstuff'MYFILE.EXT");

在稍后的最后一个区块中,我将调用:

response.End()

当我调用这个Handler时,什么也没发生。返回响应200,不会引发任何错误,但浏览器不会提示用户保存此文件。

Fiddler捕捉到的反应如下:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 23 Aug 2012 12:12:19 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=MYFILE.EXT
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 781053
Connection: Close
[raw content of the file here]

这个响应在我看来是正确的。它包含了文件的内容,但是在任何主要浏览器下,都没有文件对话框提示我保存文件。

我在这里做错了什么?

更新:如果有帮助的话,这里是我使用web应用程序中的JavaScript来调用这个HttpHandler的地方。

$.ajax({
    type: 'POST',
       url: ashxUrl,
       data: postData,
       success: function (result) {
           // Doin' stuff on success
       },
       error: function (error) {
           // Doin' stuff on error.
        }
});

您已经说过,您希望web调用的结果对您的javascript可用。如果这导致浏览器提示你保存它,那将是非常令人讨厌的,因为所有的AJAX都是不可能的。

您希望浏览器本身进行调用。对于GET来说,这将是设置self.location.href的简单问题。对于POST,最简单的方法通常是用数据填写一个隐藏的表单,然后submit()它。