如何在Composite c1中下载pdf文件

时间:2013-06-03 07:12:08

标签: c1-cms

我正在尝试实现一种功能,使用户能够在点击超链接时下载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 个答案:

答案 0 :(得分:0)

看起来您正试图在C1页面渲染器永远不会将其替换为文件的实际URL的地方使用C1语法来处理媒体文件。因此,您最终会将/media(b5354eba-3f69-4885-9eba-74576dff372d)之类的内容传递给Response.TransmitFile()函数,但这不起作用,因为它不是有效的文件路径。

如果您在C1页面上使用此语法,页面渲染器将使用该文件的真实URL替换它。

我的建议是build this URL yourself,只是链接到它,而不是使用TransmitFile。如果文件是公开访问的,那么简单的重定向就足够了。如果它已经在Web服务器上无法访问,那么使用Response.TransmitFile并获取它并将其写入输出流中没有多大意义。

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分: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