0

ユーザーがハイパーリンクをクリックして PDF をダウンロードできる機能を実装しようとしています。私がやったことは、「説明」と「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 ) を見てみてください。コードの主な問題は、ファイルが保存されている場所を想定していることです。ファイルはローカル、データベース、Azure Blob ストレージ、またはインターネット上のランダムな場所のいずれかにある可能性があるため、C1 メディア アーカイブではそれを行うことはできません。

代わり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

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

このコードも使用できます

    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

それを解決しました、ただ与える必要がありました....string filePath = "~/media({" + i.Data.Id + "})";代わりにstring filePath = "/media(" + i.Data.Id + ")";

于 2013-06-05T09:42:30.090 に答える