1

我有这个 WebService,它允许上传/下载任何文档(主要是 .docx、.doc、.pdf),它返回的只是byte[]在查询下载时。

我写了这段代码

 string ContractGUID = dtContract.Rows[0]["ContractGUID"].ToString();

 //Get Bytes from WebService
 byte[] fileData = BLL.Contract.GetDocument(new Guid(ContractGUID));
 Response.Clear();
 Response.BinaryWrite(fileData);
 Response.AddHeader("Content-Disposition", "Attachment");
 Response.Flush();

WebService 公开的其他方法是GetDocumentNameGetDocumentLen

是否可以确定 Mime-Type 或强制浏览器以正确的格式下载它?目前它正在像.htmChrome 中一样下载,打开时,我看到了有趣的字符。有更好的建议吗?

谢谢。

4

2 回答 2

1

我认为,浏览器是通过文件名来完成的。

例如:

response.Clear();
response.AddHeader("Content-Disposition", "attachment; filename=" + dbFile.filename.Replace(" ", "_"));
response.AddHeader("Content-Length", dbFile.data.Length.ToString());
response.ContentType = "application/octet-stream";
response.OutputStream.Write(dbFile.data, 0, dbFile.data.Length);
response.End();

dbFile.filename 是一个字符串

dbFile.data 是一个字节[]

于 2012-09-05T13:59:57.887 回答
1

不,如果您不通过 Content-Type 标头告诉它,就不可能强制浏览器以正确的格式下载。

Response.ContentType = "application/pdf"; //or whatever appropriate

如果 Web 服务公开了一个GetDocumentName()方法,您可能可以通过查看名称推断出适当的格式,假设该名称具有文件扩展名。这显然不是防弹的,因为您可以将文件的扩展名更改为您想要的任何内容。

另一种选择是通过查看第一个字节来尝试猜测文件格式。例如,如果文件的前 4 个字节是,25 50 44 46那么很可能这是一个 PDF 文件。在这个网站上,他们有一个相当广泛的列表。

这是可能的内容类型标头列表。

于 2012-09-05T14:03:00.037 回答