2011-09-13 2 views
4

ファイルを必要とするRESTful Webサービスと対話しようとしています。ファイルパスではなくファイル名のみを表示するには、ファイルparamでCFHTTPを取得するにはどうすればよいですか?

フィールド名をデータに設定し(APIの必要に応じて)、ファイルを絶対パスとして指定します。ファイルがサーバーに送信されると、HTTPトランザクションのファイル名は完全な絶対パスになります。

フルパスが "FileName"として記録されるため、APIに問題が発生します。

フルパスではなくファイル名のみをレポートするようにColdFusionを設定するにはどうすればよいですか?私たちは、ここでのColdFusion 9

を使用している

は、CFMLです:

CFHTTP 9 
-------------------------------7d0d117230764 
Content-Disposition: form-data; name="data"; filename="c:\temp\testfile.txt" 
Content-Type: text/plain 

This is the text, really long, well, not really. 

-------------------------------7d0d117230764-- 



IE8 
-----------------------------7db370d80e0a 
Content-Disposition: form-data; name="FileField"; filename="C:\temp\testfile.txt" 
Content-Type: text/plain 

This is the text, really long, well, not really. 
-----------------------------7db370d80e0a-- 


Chrome 13 
------WebKitFormBoundaryDnpFVJwCsZkzTGDc 
Content-Disposition: form-data; name="FileField"; filename="testfile.txt" 
Content-Type: text/plain 

This is the text, really long, well, not really. 

Firefox 6 
-----------------------------22798303036224 
Content-Disposition: form-data; name="FileField"; filename="testfile.txt" 
Content-Type: text/plain 

This is the text, really long, well, not really. 
-----------------------------22798303036224-- 

どうやらIE8とCFHTTP両方:ここ

<cfhttp url="http://server/testcode" 
     port="9876" 
     method="post" 
     result="Content"> 

    <cfhttpparam type="file" 
        name="data" 
        file="c:\temp\testfile.txt"> 
</cfhttp> 

は、異なるブラウザとHTTPの相互作用の例をいくつか示します。同じことを行います(ファイル名に "c:\ temp"を追加してください)。私はHTTPの仕様は何か分かりませんが、CFHTTPにパスを残す方法があればうれしいでしょう。

これを行う方法はありますか?

+0

一部のコードを投稿することはできますか?APIが期待しているデータの種類(バイナリ、文字列)も理解できませんか? –

+1

'httpparam'のタイプをfileに設定していて、file属性を使用していますか? –

答えて

5

を私はかつて、あなたと同じような問題に遭遇しました。私はパスを除外しても気にしなかったが、サーバのファイルシステム上のファイル名とは異なるファイル名を送信したかった。私はCFタグを使ってそれを行う方法を見つけることができませんでしたが、私はそれをJavaに落とすことによって動作させることができました。私はorg.apache.commons.httpclientを使用しました。これにはCF9 IIRCが付属しています。それは(私はもっと複雑なコードから移調よ、任意のタイプミスはご容赦)このような何かを行く:

oach = 'org.apache.commons.httpclient'; 
oachmm = '#oach#.methods.multipart'; 
method = createObject('java', '#oach#.methods.PostMethod').init(post_uri); 
filePart = createObject('java', '#oachmm#.FilePart').init(
    'fieldname', 
    'filename', 
    createObject('java', 'java.io.File').init('filepath') 
); 
method.setRequestEntity(
    createObject('java', '#oachmm#.MultipartRequestEntity').init(
    [ filePart ], 
    method.getParams() 
) 
); 
status = createObject('java', '#oach#.HttpClient').init().executeMethod(method); 
method.releaseConnection(); 
+0

ありがとう、私はこれが行く方法であることを認識し始めています。少なくとも、CFMLに関しては、SOAPはRESTよりもはるかに簡単です。 –

+0

今日、CF10サーバーでこの問題が発生しました。または、それは[余分な古い質問](http://stackoverflow.com/q/3738580/2404501)で説明されている "余分な空白行"の問題でした - どちらの方法でも、cfhttpはバグのために使用できませんでした。上記のHttpClientで提供されたソリューションが機能しました。 –

3

私は、コンテンツタイプがtext/plainであることがわかりので、最初に私はあなたがCFHTTP

<cfhttp url="http://server/testcode" 
     port="9876" 
     method="post" 
     result="Content" 
     multipart = "yes"> 

    <cfhttpparam type="file" 
        name="data" 
        file="c:\temp\testfile.txt"> 
</cfhttp> 

上のマルチパートプロパティは、あなたの問題を解決できる追加する必要があると思います。

+0

ありがとうございます。あなたが見ているコンテンツタイプはファイルのものです。これは.txtです。CFHTTPは自動的にファイルパラメータの存在によりマルチパートモードにします。これは私が投稿に含まれていなかったヘッダー情報に見ることができます。 –

+0

あなたは正しいです...今、あなたは何かを明確にすることができます:APIの使用に関するファイル名はどれくらい重要ですか?つまり、あなたはバイナリデータとしてファイルを転送しているのですが、APIのどこにでも使われているファイルの名前ですか? API自体についてさらに情報を得ることは可能ですか? –

+0

これはファイルセキュリティシステムであるWatchDox APIです。それは元のファイル名を保持するファイルリストを作成します(スラッシュは削除されています)ので、ファイルを保存すると、推奨ファイル名は "c:temptestfile.txt"になります。 –

2

すべての投稿の間に表示される唯一の違いは、CFがname="data"を送信していて、他のすべてがname="FileField"を送信しているということです。他のブラウザの提出が正しいならば、私はあなたのcfhttpparamを変更します

<cfhttpparam type="file" 
       name="FileField" 
       file="c:\temp\testfile.txt"> 

、あるいは追加のFileNameパラメータ送信してみてください:

<cfhttpparam type="file" 
       name="data" 
       file="c:\temp\testfile.txt" /> 

<cfhttpparam type="formField" 
       name="FileName" 
       value="testfile.txt" /> 
+0

Danさん、ありがとうございました。これは私も同様に処理することをお勧めします。実際にはColdFusion自体(非CFHTTP)のようなものです。残念ながら、フィールドをデータと呼ぶ必要があるAPIは制御できません。それは独立したファイル名フィールドを期待していませんので無視します。 –

0

は、だから私は、APIへのアクセスを得ることができたし、それが動作しました。この特定の部分のコードは次のとおりです(ログインしてドキュメントのGUIDを取得できたと仮定します)。

<!--- upload a document ---> 
<cfhttp method="post" url="<path to watchdox api upload>/#local.guid#/upload"> 

    <cfhttpparam type="header" name="Content-type" value="multipart/form-data"> 
    <cfhttpparam type="header" name="x-wdox-version" value="1.0"> 
    <cfhttpparam type="header" name="x-wdox-ssid" value="#local.xwdoxssid#" > 
    <cfhttpparam type="formfield" name="filename" value="testfile.txt" > 
    <cfhttpparam type="file" file="c:\temp\testfile.txt" name="data" > 

</cfhttp> 

はそれに役立つことを願っています。

+0

ちなみに、ダンは提案がありました:-)しかし、APIを知らなくても、答えは簡単ではありません。 –

+0

ありがとう。私はそれを試みました。私たちのために働かない。最終的に、c:temptestfile.txtというファイル名になります。 documentNameパラメータをポストに追加すると、表示名は変更されますが、表示/保存に行くときの基礎となるファイル名にはパスの内容が残っています。 –