1

私は、オフィス内の認証されたユーザーがクライアントのファイルをアップロードし、ファイルをダウンロードするためのリンクのリストを作成し、リンクのリストをクライアントに電子メールで送信できるようにする、オフィス用のアプリケーションを作成しています。

オフィスのユーザーがログインすると、セッションスコープにUUIDが割り当てられます。そのUUIDは、アップロードされたファイルが保存されるディレクトリ名になります。

時々、古いファイルをクリアしてディレクトリを削除する必要がありますが、その場合、クライアントが古いリンクからファイルを再ダウンロードしようとする可能性があります。

ColdFusion 9では、これをどのようにキャッチしてエラーページに送信しますか?また、ダウンロードが開始されたら、同様のコードを使用してユーザーをリダイレクトし、ダウンロードプロセス中に空白のページに座っているだけではないようにしたいと考えています。

これが私の強制ダウンロードページで、ファイルを提供するためにフォルダー名変数とファイル名変数を取ります。

<cfset folder = #URL.folder#>
<cfset FileDownload = #URL.file#>

<cfset exten = ListLast(FileDownload, ".")>

<cfswitch expression="#exten#">
<cfcase value="zip"><cfset content_type = "application/zip, application/x-zip, application/x-zip-compressed, application/octet-stream, application/x-compress, application/x-compressed, multipart/x-zip"></cfcase>
<cfcase value="ai"><cfset content_type = "application/illustrator"></cfcase>
<cfcase value="eps"><cfset content_type = "application/illustrator, application/octect-stream"></cfcase>
<cfcase value="pdf"><cfset content_type = "application/pdf, application/x-pdf, application/acrobat, applications/vnd.pdf, text/pdf, text/x-pdf"></cfcase>
<cfcase value="psd"><cfset content_type = "image/photoshop, image/x-photoshop, image/psd, application/photoshop"></cfcase>
<cfcase value="jpg"><cfset content_type = "image/jpeg"></cfcase>
<cfcase value="png"><cfset content_type = "image/png"></cfcase>
<cfcase value="tif"><cfset content_type = "image/tiff"></cfcase>
<cfdefaultcase><cfset content_type = "image/jpeg"></cfdefaultcase>
</cfswitch>

<cfset fileToGetSizeOf = expandPath("./#folder#/#FileDownload#") />


<cfoutput><cfheader name="content-disposition" value="attachment;filename=#FileDownload#"><cfheader name="content-length" value="#getFileInfo(fileToGetSizeOf ).size#" />
<cfcontent type="#content_type#" file="#ExpandPath("./#folder#")#/#FileDownload#" deletefile="#delete_file#"></cfoutput>
4

4 に答える 4

3

ここで達成したい3つの目標があります。

  1. ファイルを安全に提供します。現在、システム(または他のユーザー)ファイルの悪用から保護されていません。たとえば、次のようになります(URLキーの代わりに渡された値を設定しました)。

    <cfset folder = "../../../some/other/path/" />
    <cfset FileDownload = "some_other_file.pdf" />
    
  2. ファイルまたはディレクトリがもう存在しない場合は、404ページを表示します。

  3. ダウンロードが開始されたら、素敵なページを表示します。何かが足りないかもしれませんが、ダウンロード開始後(=ヘッダーが送信される)にユーザーをリダイレクトするのはかなり注意が必要です。

とにかく、これらすべてに非常にシンプルで信頼性の高いソリューションがあります。

各レコードに次のものが含まれるように、ファイルのリストをデータベースに保持する必要があります。

  1. 一意のID。
  2. ファイル所有者ID。
  3. ディレクトリ名。
  4. ファイル名。
  5. 説明(オプションで、ファイル名を使用できます)。
  6. コンテンツタイプ(オプション、引き続き拡張機能付きのアプローチを使用できます)。
  7. 作成日(オプション、スケジュールされたクリーニングに使用できます)。
  8. ダウンロードカウンター(ダウンロード数を制限する場合はオプション)。
  9. ステータス(オプション、削除されたファイルのファイルシステムチェックを防ぐために使用できます)。

注:パスは一時的なものであるため、3〜4は単一の列('path / filename.ext')として実行できます。

したがって、アプリケーションcreates a list of links to download the files and emails the client with the list of links.の場合、各ファイルもデータベースに記録されます。これらの各リンクは、次のようになります。

<a href="http://yourwebsite.tld/download.cfm?file=#ID#">#DESCRIPTION#</a>

ユーザーがリンクをクリックすると、リンクスクリプトは次のように実行されます。

  1. DBにIDが存在するか確認してください。そうでない場合は、404ページにリダイレクトします。
  2. 現在のユーザーが所有者IDと一致するかどうかを確認します。そうでない場合は、404ページにリダイレクトします。
  3. ファイルのステータスを確認し、カウンターをダウンロードします(制限する必要がある場合)。そうでない場合は、404ページにリダイレクトします。
  4. 保存されたディレクトリとファイル名を使用して、実際のファイルの存在を確認します。そうでない場合は、404ページにリダイレクトします。
  5. URLにキーがある場合:ダウンロードカウンターをインクリメントし、 cfcontentstartとコンテンツタイプを使用してファイルを提供します。
  6. ELSEは、「ダウンロードがすぐに開始されます。待ちたくない場合は、このリンクをクリックしてください」というページのHTMLをレンダリングします。ここで、リンクは次のようdownload.cfm?file=#ID#&start=yesになります。さらにmeta http-equiv="refresh"、同じURLを使用します。

ノート:

  1. 手順1〜4は、カスタムの単一のtry / catchブロックにラップされる場合があるerrorCodeため、リダイレクトの場所を1つにすることができます。
  2. ここでの手順5の秘訣は、ユーザーが[ダウンロード]リンクをクリックしてもページに留まり、空白のページが表示されないことです。これは目標#3の正確な解決策ではありませんが、いくつかのトリックなしで何かをより良くすることは難しいでしょう。たぶん私は間違っていて、誰かがここでより良い方法を提案することができます、それはクールでしょう。「このリンク部分をクリック」を削除して、このページを「自然」に見せることができます。
于 2012-06-26T06:29:08.627 に答える
0

FileExists(absolute_path)関数を使用して、ダウンロードしたファイルの存在を確認できます。

于 2012-06-27T07:34:13.357 に答える
0

サイトに 404 ページがある場合は、既にエラー ページに誘導しています。または、少なくともあなたのウェブサーバーはそうです。サイト全体の 404 ページをセットアップしていない場合は、追加機能 (ログ、アラートなど) を提供する cfm ページにします。

于 2012-06-26T00:28:43.967 に答える
0

FileExists存在を確認し、それに基づいて決定を下すために使用できます。

<cfif NOT FileExists(fileToGetSizeOf)>
  <!--- send a 404 --->
<cfelse>
  <!--- send the file --->
</cfif>
于 2012-06-26T03:46:24.040 に答える