【问题标题】:Download Document in the right format without MIME在没有 MIME 的情况下以正确的格式下载文档
【发布时间】:2012-09-05 13:51:01
【问题描述】:

我有这个 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 或强制浏览器以正确的格式下载它?目前它在 Chrome 中以.htm 的形式下载,打开时,我看到了有趣的字符。有更好的建议吗?

谢谢。

【问题讨论】:

标签: c# asp.net file http-headers


【解决方案1】:

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

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

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

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

这是possible content-type headers的列表。

【讨论】:

  • 这些链接非常有用。谢谢。
【解决方案2】:

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

例如:

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 是一个字节[]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多