Как мне получить CFHTTP с параметром файла, чтобы показать только имя файла, а не полный путь? - PullRequest
4 голосов
/ 13 сентября 2011

Мы пытаемся взаимодействовать с веб-службой RESTful, которая ожидает файл.

Я задаю имя поля для данных (как того требует 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 ]

5 голосов
/ 13 сентября 2011

Однажды я столкнулся с проблемой, похожей на вашу.Я не заботился об исключении пути, но хотел отправить имя файла, отличное от имени файла в файловой системе моего сервера.Я не мог найти способ сделать это, используя 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();
3 голосов
/ 13 сентября 2011

Я вижу, что тип контента - текстовый / простой, поэтому сначала я думаю, что вам нужно добавить свойство multipart в 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>

. Может решить вашу проблему.

2 голосов
/ 13 сентября 2011

Единственное различие, которое я вижу между всеми постами, заключается в том, что 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 голосов
/ 16 сентября 2011

Итак, я смог получить доступ к 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>

Надеюсь, это поможет.

...