如何通过文件参数获取CFHTTP以仅显示文件名而不是完整路径?

时间:2011-09-13 10:58:04

标签: coldfusion

我们正在尝试与需要文件的RESTful Web服务进行交互。

我将字段的名称设置为数据(根据API的要求),然后将文件指定为绝对路径。当文件进入服务器时,HTTP事务中的文件名是完整的绝对路径。

这会导致API出现问题,因为完整路径会被记录为“FileName”。

如何让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离开路径会很好。

有没有办法做到这一点?

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:3)

我看到内容类型是text / plain,所以首先我认为你需要在CFHTTP上添加multipart属性

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

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

可以解决您的问题。

答案 2 :(得分: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" />

答案 3 :(得分: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>

希望它会有所帮助。