2010-02-10 114 views
10

我想使用web服务从网站推送文件到浏览器。我目前正在将该文件读入一个base64字节数组,并从web服务返回。这个webservice从一个网站被调用,并且我被困在如何将这个原始文件推送到浏览器中。理想情况下,我希望将字节数组读入内存流,然后在可能的情况下将其写入Response流,以便最终用户下载文件。从webservice下载文件 - 在ASP.NET网站

+0

什么你用这种方法遇到的问题是什么?你没有提出问题,所以这可能会很快关闭。 – Oded 2010-02-10 19:18:30

回答

12

首先,不是发送一个base64字节数组,而是让您的web服务为您的文件返回一个字节数组。 Response.OutputStream.Write()会自动base64编码你的字节,所以你不妨将它们在你的内存流中解码。

其次,你需要的不仅仅是字节。您需要与该文件关联的元数据。对于下面的代码片段,我已将所有这些元数据放入一个单独的类(名为“file”的本地实例)中。然后,只要使用这个片段,一旦你有你需要的数据:

Response.Clear(); 
Response.ClearHeaders(); 
Response.ContentType = file.ContentType; 
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); 
Response.AddHeader("Content-Length", file.FileSize.ToString()); 
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); 
Response.Flush(); 
Response.End(); 
+3

小心与Response.End()http://stackoverflow.com/questions/1087777/is-response-end-considered-harmful – 2010-02-10 19:59:12

+0

@托德史密斯:感谢指针。我意识到这个问题,但你说对方可能不对;这可能是一个严重的问题。然而,在下载文件的情况下,不需要进一步处理,因此'Response.End()'*可能是正确的调用。这当然是在我的情况。 – Randolpho 2010-02-10 20:28:29

+2

我应该使用Response.Close()而不是Repsonse.End()吗? – user210757 2010-02-19 00:14:00

3

这是可能的,你需要确保你明确设置的HttpResponse的ContentType的,例如:

Response.ContentType = "image/jpeg"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 

如果你想控制的文件名,你就必须添加内容 - 配置标题。谷歌可以帮助您找到解决问题的正确方法。

+0

+1,但您忽略了Content-Disposition,这对于文件下载来说是最重要的。编辑:然后你添加它。所以忽略这一点。 :) – Randolpho 2010-02-10 19:24:25

0

它真的取决于您的web服务的接口。即SOAP,REST,ASPX。

您可以尝试的一件事是更改您的响应中的内容类型为“Application/octet-stream”。或者类似的东西告诉接收者MIME类型。

如果您使用WCF休息,您可以使用Stream作为Web服务上的返回类型。

1

将文件嵌入到Web服务中通常是一个糟糕的主意。你只是增加开销和复杂性而没有真正的好处。

相反,您应该提供一个IHttpHandler来处理文件上传。大多数网络服务器还提供辅助API来简化这一点,例如在ASP.NET中,您可以访问上传文件:

HttpContext.Request.Files [0]

有大量的JavaScript文件上传脚本,可以简化这个客户端上: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

+0

我实际上是试图将文件下载到客户端,而不是上传到服务器 – user210757 2010-02-19 00:16:34

+0

该链接是垃圾邮件或时间上的丢失。 – mcy 2017-03-03 07:56:21