2011-09-13 81 views
4

我們正在嘗試與期望文件的RESTful Web服務進行交互。如何獲得帶有文件參數的CFHTTP以僅顯示文件名而不是完整路徑?

我將該字段的名稱設置爲數據(根據API的要求),然後將該文件指定爲絕對路徑。當文件傳遞給服務器時,HTTP事務中的文件名就是完整的絕對路徑。

這會導致API出現問題,因爲完整路徑會被記錄爲「文件名」。

如何讓ColdFusion只報告文件名而不是完整路徑?

我們使用ColdFusion 9

這裏是CFML:

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

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

這裏有不同的瀏覽器的HTTP交互的一些例子:

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都做同樣的事情(將「c:\ temp」添加到文件名中)。我不確定HTTP的規範是什麼,但如果有辦法讓CFHTTP離開這條路,那將會很不錯。

有沒有辦法做到這一點?

+0

你可以發表一些代碼,我不確定要理解...... API的期望類型的數據(二進制,字符串)? –

+1

您是否將「httpparam」的類型設置爲文件並使用文件屬性? –

回答

5

我碰到類似你這樣的問題,一次。我並不在乎排除路徑,但我想發送一個不同於我服務器文件系統上文件名稱的文件名。我找不到使用CF標籤的方法,但我可以通過將它放入Java中來實現它。我使用了配有CF9 IIRC的org.apache.commons.httpclient。它是這樣的(請原諒任何錯別字,我是從複雜的代碼調換):

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參數添加到帖子中,它將更改顯示名稱,但底層文件名(當您去查看/保存時)仍然包含路徑內容。 –

相關問題