【问题标题】:Download file from webservice - in ASP.NET site从 Web 服务下载文件 - 在 ASP.NET 站点中
【发布时间】:2011-01-15 10:14:45
【问题描述】:

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

【问题讨论】:

  • 您在使用这种方法时遇到了什么问题?你没有问任何问题,所以这可能会很快结束。

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


【解决方案1】:

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

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

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

【讨论】:

  • +1,尽管您遗漏了 Content-Disposition,这对于文件下载最重要。编辑:然后你添加了它。所以忽略这个。 :)
【解决方案2】:

首先,让您的网络服务简单地为您的文件返回一个字节数组,而不是发送一个 base64 字节数组。 Response.OutputStream.Write() 将自动对您的字节进行 base64 编码,因此您不妨将它们未编码到内存流中。

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

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();

【讨论】:

  • @Todd Smith:感谢您的指点。我知道这个问题,但你说得对,其他人可能不知道;这可能是一个严重的问题。然而,在文件下载的情况下,没有您想要或应该做的进一步处理,因此Response.End() is 可能是正确的调用。对我来说当然是这样。
  • 那么我应该使用 Response.Close() 而不是 Repsonse.End() 吗?
  • 使用 Web 服务中的 Response.TransmitFile 怎么样 - 有什么理由不这样做?
  • Response.TransmitFile 如果该文件作为未加密文件存在于服务器的文件系统上,它将完美运行,因为 TransmitFile 只需要文件的路径。很多时候,该文件不作为 TransmitFile 可映射的文件存在。有时它存储在数据库中。有时(希望总是在企业情况下,但遗憾的是,并非总是如此)它在存储期间被加密,并且必须在传输之前由服务器解密。
【解决方案3】:

这实际上取决于您的网络服务的接口。即 SOAP、REST、ASPX。

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

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

【讨论】:

    【解决方案4】:

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

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

    HttpContext.Request.Files[0]

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

    【讨论】:

    • 我实际上是在尝试将文件下载到客户端,而不是上传到服务器
    • 该链接要么是垃圾邮件,要么及时丢失了上下文。
    猜你喜欢
    • 2011-05-31
    • 2019-01-07
    • 2015-04-04
    • 2013-08-30
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多