如何在Composite c1中下载pdf文件



我正在尝试实现一个功能,使用户可以在点击超链接时下载PDF。我所做的是,我创建了一个全局数据类型Publications,它的值为"Description"one_answers"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();

这显示一个错误说"无法找到文件",知道为什么吗?

看起来您正在尝试在C1页面呈现器从未将其替换为文件的实际url的地方对媒体文件使用C1语法。因此,您最终将/media(b5354eba-3f69-4885-9eba-74576dff372d)传递给Response.TransmitFile()函数,这将不起作用,因为这不是一个有效的文件路径。

如果在C1页面上使用此语法,页面呈现器将用文件的实际url替换它。

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

尝试查看具有此功能的DownloadFoldersAsZip包(https://bitbucket.org/burningice/compositec1contrib/src/4c31794cd46c/DownloadFoldersAsZip?at=default)。您的代码的主要问题是您假设了文件的存储位置。你不能在C1 Media Archive中这样做,因为文件可以在本地,在数据库中,在Azure Blob存储中,或者只是在互联网上的随机位置。

您应该使用IMediaFile实例的GetReadStream()扩展方法。这将给你一个流,你可以复制到你的Response.ResponseStream

请看这里的例子:https://bitbucket.org/burningice/compositec1contrib/src/4c31794cd46cb03dd0b0ee830b83204753355b03/DownloadFoldersAsZip/Web/GenerateZipHandler.cs?at=default#cl-145

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

您也可以使用以下代码

    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

最新更新