【问题标题】:How do I get CFHTTP with file param to show only file name rather than full path?如何使用文件参数获取 CFHTTP 以仅显示文件名而不是完整路径?
【发布时间】:2011-09-16 22:19:42
【问题描述】:

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

我将字段的名称设置为 data(根据 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 关闭路径,那就太好了。

有没有办法做到这一点?

【问题讨论】:

  • 您能否发布一些代码,我不确定是否理解... API 期望的数据类型(二进制、字符串)是什么?
  • 您是否将httpparam 的类型设置为文件并使用文件属性?

标签: coldfusion


【解决方案1】:

我曾经遇到过与您类似的问题。我不在乎排除路径,但我想发送与服务器文件系统上的文件名不同的文件名。我根本找不到使用 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();

【讨论】:

  • 谢谢,我开始意识到这是要走的路。事实证明,至少在 CFML 方面,SOAP 比 REST 容易得多。
  • 我今天在 CF10 服务器上遇到了这个问题。或者可能是an even older question 中描述的“额外空白行”问题 - 无论哪种方式,cfhttp 由于其错误而无法使用。上面使用 HttpClient 给出的解决方案有效。
【解决方案2】:

我看到内容类型是 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>

可以解决您的问题。

【讨论】:

  • 谢谢,您看到的内容类型是文件的内容类型,即 .txt。 CFHTTP 会在存在 file 参数的情况下自动将其投入多部分模式。这可以在我没有包含在帖子中的标题信息中看到。
  • 你是对的......现在你能澄清一下:文件名对于 API 的使用有多重要?我的意思是,您将文件作为二进制数据传输,API 在任何地方使用的文件名是什么?是否有可能获得有关 API 本身的更多信息?
  • 这是WatchDox api,它是一个文件安全系统。它构建了一个文件列表,保留了原始文件名(删除了斜杠),因此当您保存文件时,建议的文件名是“c:temptestfile.txt”。
【解决方案3】:

我看到所有帖子之间的唯一区别是 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" />

【讨论】:

  • 感谢 Dan,这也是我希望处理的方式,事实上,ColdFusion 本身(非 CFHTTP)就是这样做的。不幸的是,我无法控制需要将该字段称为数据的 API。它不需要一个独立的文件名字段,因此会忽略一个。
【解决方案4】:

所以我能够访问 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>

希望它会有所帮助。

【讨论】:

  • 顺便说一句,Dan 的提议是对的 :-) 但是不了解 API,很难回答...
  • 谢谢。我已经试过了。对我们不起作用。我们最终得到一个文件名:c:temptestfile.txt。如果我将 documentName 参数添加到帖子中,它将更改显示名称,但底层文件名(当您查看/保存时)仍然包含路径内容。
猜你喜欢
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2012-02-23
  • 2012-01-21
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多