2009-05-13 31 views
9

ColdFusion:アップロードする前にファイルの名前を取得する

<cffile action = "upload"> 

を呼び出す前に、ファイルのファイル名を取得するにはどうすればよいですか?一時ファイルのファイル名は取得できますが、実際のファイル名は取得できません。 PHPの土地では、私が望むものを得るために$ _FILESのスーパーグローバルを使うことができます。しかし、ColdFusionにそのようなものは存在しないと言えるほどです。

私はファイル名をクライアント側で得ることができますが、本当にこのサーバー側をやりたいです。

ありがとう

+7

どのように非常のColdFusionの典型的な基本的な機能を持っていません。 – Teekin

答えて

7

私は、cffileタグを呼び出す前に見つけるための方法を知りませんが、回避策があるかもしれません。

<cffile action="upload">に電話するときは、result="variable"を使用して結果を指定できます。したがって、アップロード先を一時ファイルとして呼び出します。結果変数は、クライアントのコンピュータ上のファイルの名前であるメンバーclientFileを含む構造体です。

ここで、<cffile action="move">を使用すると、元のファイル名で行う必要がある作業をすべて行うことができます。

+0

答えてくれてありがとう...唯一の方法だと思われるので、このソリューションを検討しました。しかし、私はあなたが投稿したものよりずっと良くなるとは思わない。 – nlaq

+0

複数の**ファイルアップロード**リクエストを連続して作成すると問題が発生します –

-1

入力コントロールにname属性が定義されている場合、ファイル名はFORMスコープになります。たとえば:

<cfif not structIsEmpty(form)> 
    <cfdump var="#form#"> 
<cfelse> 
    <html> 
    <head> 
     <title>Title</title> 
    </head> 
    <body> 
     <form method="POST" action="#cgi.SCRIPT_NAME#"> 
      <input type="file" name="fileIn" /> 
      <input type="Submit" name="formSubmit"> 
     </form> 
    </body> 
    </html> 
</cfif> 
+1

私たちには望ましくないtmpファイル名が与えられます... – nlaq

+0

私はenctypeをやめました。今自分自身を改造する。 –

0

別のオプションは、クライアント側のコードは、あなたがして、サーバー側を持つことになり、ファイル名、で隠しフォームフィールドを移入持っているかもしれません。

ベン・ドゥームの答えは、一般的に私がそれに近づく方法です。

+0

ええ、我々もこれを考慮しました。しかし、あなたの人生を悲惨なものにするために猛烈なFireBugを使わないで、あなたのユーザに頼ることはできません。クライアント側のvarが嘘をついたことがわかったら(あなたがアップロードして実際のファイル名を取得したら)、リクエストを返すことができると思います。しかし、私はよりエレガントな解決策を望みます。回答ありがとう: – nlaq

1

これはどのように行うのですか?基本的に、ファイルフィールドと文字列フィールドがあります。 JavaScriptは、フォームが送信される前にブラウザからファイル名を取得します。明らかに、反対側のファイル名が実際に存在することを確認する必要があります(ユーザーがJavaScriptを無効にしている場合は空白になります)。プラットフォームの違いを処理するために文字列を解析する必要があります(/users/bob/file.jpgC:\Documents and Settings\bob\file.jpg

<script> 
    function WriteClientFileName(){ 
     $('ClientFileName').value = $('ClientFile').value; 
    } 
</script> 

<form enctype="multipart/form-data" onsubmit="WriteClientFileName();"> 

    <input type="File" name="ClientFile" id="ClientFile"> 
    <input type="hidden" name="ClientFileName" id="ClientFileName" value=""> 

    <input type="submit"> 
</form> 

なお、この手法はクロスランゲージです。 RoR、PHP、JSPなどでも同様に動作します。

編集:ユーザが「激しいFireBugを抱えている」場合、何が問題なのですか?たとえ彼らがFirebugを持っていなくても、ファイルの最後に名前を変更して入力を変更することができます。さらに、入力を検証しているのでしょうか?

-1

ColdFuson、Railo、またはOpenBDでサーバーに保存する前に、アップロードされたファイルのファイル名を知る方法がありません。私は通常、ファイルを保存する前に、createUUID()関数を使って '私の'新しいファイル名を生成します。

2

WOW、私は偉大で簡単な解決策を見つけました!小さなjavascriptで

このようにして、cffileアップロード用の一時ファイル名と実際のファイルが取得されます。

GetPageContext().formScope().getUploadResource('your_file_input_form_name').getName();

は多分これが同様のAdobeサーバー上で動作します:私はRailoを使用して、元のファイル名を見つけたんだデータベース

<html> 
<head> 
<script type="text/javascript"> 
function PassFileName() 
{ 
document.getElementById("fileName").value=document.getElementById("fileUp").value; 
} 
</script> 
</head> 
<body> 
<form name="form1" method="post" enctype="multipart/form-data" > 
File: <input type="file" name="fileUp" id="fileUp" size="20" onchange="PassFileName()" /> <br /> 
Title: <input type="text" name="Title" id="Title"><br /> 
<input type="hidden" id="fileName" size="20" name="fileName" /> 
<input type="submit" name="submit"> 
</form> 
</body> 
</html> 
6

のためのJPGの名前は?アップロードされたファイルの名前を何とか変更したい場合、2つの一時ディレクトリ(Renaming Files As They Are Uploaded (how CFFILE actually works)を参照)に移動したくない場合は非常に便利です。

+0

ありがとう、私はこれを正確に必要とした。魅力的な作品! – Mattijs

+0

FYIこれは、Adobe ColdFusionではなく、Railoでのみ動作します。 Adobe ColdFusionでこれを行う方法については、私の答えを参照してください。 –

14

はい、可能です。あなたはのcffileタグを使用する前に、クライアントのファイル名をつかむために、この機能を使用することができます:ここ

<cffunction name="getClientFileName" returntype="string" output="false" hint=""> 
    <cfargument name="fieldName" required="true" type="string" hint="Name of the Form field" /> 

    <cfset var tmpPartsArray = Form.getPartsArray() /> 

    <cfif IsDefined("tmpPartsArray")> 
     <cfloop array="#tmpPartsArray#" index="local.tmpPart"> 
      <cfif local.tmpPart.isFile() AND local.tmpPart.getName() EQ arguments.fieldName> <!--- ---> 
       <cfreturn local.tmpPart.getFileName() /> 
      </cfif> 
     </cfloop> 
    </cfif> 

    <cfreturn "" /> 
</cffunction> 

詳細情報:http://www.stillnetstudios.com/get-filename-before-calling-cffile/

+0

それは動作します!ありがとうございました。このような基本的なことを要求から外すのは難しいことですが、それはCF開発者の人生です。 –

+0

Nifty機能!ありがとう。 ColdFusion 10で動作することを確認しました。 – PhilNicholas

関連する問題