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