我正在尝试实现一种功能,使用户能够在点击超链接时下载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();
这显示错误,说“找不到文件”,不知道为什么?
答案 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
答案 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