从webservice下载文件 - 在ASP.NET站点中

时间:2010-02-10 19:16:50

标签: c# asp.net file web-services download

我想使用网络服务从网站将文件推送到浏览器。我目前正在将文件读入base64字节数组,并从webservice返回。这个web服务是从一个网站调用的,我一直坚持如何将其作为原始文件推送到浏览器。理想情况下,我想将字节数组读入内存流,然后在可能的情况下将其写入Response流,以便最终用户只下载文件。

4 个答案:

答案 0 :(得分:13)

首先,让您的Web服务只返回文件的字节数组,而不是发送base64字节数组。 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();

答案 1 :(得分:3)

有可能,您需要确保明确设置HttpResponse的ContentType,例如:

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

如果要控制文件名,则必须添加Content-Disposition标头。 Google可以帮助您找到正确的解决方法。

答案 2 :(得分:1)

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

相反,你应该提供一个IHttpHandler来处理文件上传。大多数Web服务器还提供辅助API以简化此操作,例如,在ASP.NET中,您可以使用以下命令访问上传的文件:

HttpContext.Request.Files [0]

有很多javascript文件上传脚本可以在客户端上简化此操作: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

答案 3 :(得分:0)

这实际上取决于您的Web服务的界面。即SOAP,REST,ASPX。

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

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