0

我正在尝试实现一种功能,使用户能够在单击超链接时下载 PDF。我所做的是,我创建了一个全局数据类型 Publications,它采用值“Description”和“PDF DOC”,并且我有一个带有超链接的用户控件,该超链接将描述绑定为其文本。

LinkButton1.Text = details.Description;
Composite.Data.DataReference<IMediaFile> i = new Composite.Data.DataReference<IMediaFile>((details as A.DataTypes.Publications).PdfDoc);
string filePath = "/media(" + i.Data.Id + ")";

然后点击链接按钮我...

Response.ContentType = "Application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=Test_PDF.pdf");
Response.TransmitFile(filePath );
Response.End();

这显示一个错误,说“找不到文件”,知道为什么吗?

4

4 回答 4

0

尝试查看具有此功能的 DownloadFoldersAsZip 包 ( https://bitbucket.org/burningice/compositec1contrib/src/4c31794cd46c/DownloadFoldersAsZip?at=default )。您的代码的主要问题是您假设文件的存储位置。使用 C1 媒体存档无法做到这一点,因为文件可以是本地的、数据库中的、Azure Blob 存储中的,也可以只是 Internet 上的随机位置。

相反,您应该使用实例的GetReadStream()扩展方法。IMediaFile这将为您提供一个流,您可以将其复制到您的Response.ResponseStream

有关示例,请参见此处:https ://bitbucket.org/burningice/compositec1contrib/src/4c31794cd46cb03dd0b0ee830b83204753355b03/DownloadFoldersAsZip/Web/GenerateZipHandler.cs?at=default#cl-145

于 2013-06-03T16:20:26.183 回答
0

您也可以使用此代码

    Composite.Data.DataReference i = new Composite.Data.DataReference((details as A.DataTypes.Publications).PdfDoc)

这给出了媒体文件参考

    string fileName = "/App_Data/Media/" + i.Data.Id.ToString();
    this.Response.AddHeader("content-disposition", string.Format(
       "attachment;filename=download.pdf", Path.GetFileName(fileName)));
    this.Response.ContentType = "application/pdf";
    this.Response.WriteFile(this.Server.MapPath(fileName));

这可以得到文件下载为download.pdf

于 2013-08-14T07:02:40.970 回答
0

看起来您正在尝试在 C1 页面渲染器永远不会用文件的实际 url 替换它的地方对媒体文件使用 C1 语法。所以你最终将类似的东西传递/media(b5354eba-3f69-4885-9eba-74576dff372d)Response.TransmitFile()函数,这将不起作用,因为那不是有效的文件路径。

如果您在 C1 页面上使用此语法,页面渲染器会将其替换为文件的真实 url。

我的建议是自己构建这个 URL并链接到它,而不是使用TransmitFile. 如果文件对公众开放,一个简单的重定向就足够了。如果它已经可以在 Web 服务器上访问,那么使用Response.TransmitFile和获取它并将其写入输出流就没有多大意义了。

于 2013-06-03T11:30:37.843 回答
0

解决了它,只需要给....string filePath = "~/media({" + i.Data.Id + "})";而不是string filePath = "/media(" + i.Data.Id + ")";

于 2013-06-05T09:42:30.090 回答