Получить файл из URL-адреса автоматической загрузки в coldfusion

Я пытаюсь получить файл с URL-адреса автоматической загрузки, используя cfhttp. Я использую следующий код:

<cfhttp method="get" url="http://www.example.com/getfile" path="E:/" file="abc.csv">

В этом случае я указал тип файла как CSV, поэтому я могу получить файл, но тип файла может измениться. Я попытался CFHTTP.MIMETYPE получить тип файла и использовать его следующим образом:

<cfhttp method="get" url="http://www.example.com/getfile">
<cffile action="write" file="E:/abc.#listLast(cfhttp.MIMETYPE,'/')#" output="#cfhttp.FileContent#">

И это работает для файлов CSV и XML. Но я хочу, чтобы он работал и с файлами Excel.

Пожалуйста помоги. Заранее спасибо.


person Beginner    schedule 12.02.2015    source источник
comment
Вы пытались установить getAsBinary="Auto" в теге cfhttp?   -  person Regular Jo    schedule 12.02.2015
comment
Я могу получить его как двоичный файл, но как получить расширение файла?   -  person Beginner    schedule 12.02.2015
comment
@cfqueryparam Могу ли я как-нибудь получить расширение файла?   -  person Beginner    schedule 12.02.2015
comment
Дамп объекта cfhttp для просмотра заголовков. Обычно имя файла включается в заголовок Content-Disposition.   -  person Leigh    schedule 13.02.2015
comment
@Leigh Да, имя файла есть в Content-Disposition только для URL-адресов автоматической загрузки.   -  person Beginner    schedule 13.02.2015
comment
Примечание: очевидно, ваш реальный код должен иметь некоторую обработку ошибок. Сначала проверьте статус вызова cfhttp. Сохраняйте файл на диск только в том случае, если вызов был успешным.   -  person Leigh    schedule 13.02.2015
comment
@Leigh Да, я делаю то же самое   -  person Beginner    schedule 13.02.2015


Ответы (2)


Как упоминал Обычный Джо, вам нужно добавить getAsBinary=Auto в cfhttp, чтобы это заработало. Спасибо Дипаку Кумару Падхи за первоначальный ответ, который указал мне правильное направление.

<cfhttp method="get" url="http://www.example.com/getfile" getAsBinary="Auto" result="cfhttp">
        
<cfdump var="#cfhttp#">
        
<!--- Returns the file name with double quotes, ex. '"Users.zip"' --->
<cfset fileNameWithQuotes = listlast(cfhttp["responseHeader"]["content-disposition"],";=")>
        
<!--- Remove the '"' in the file name so it is Users.zip --->
<cfset fileName = REPLACENOCASE(fileNameWithQuotes,'"','', 'ALL')>
       
<!--- Write the zip to the server location ---> 
<cffile action="write" file="E:/abc/#fileName#" output="#cfhttp.FileContent#">
        
<!--- if zip file, unzip the file to get the csv --->
<cfzip file="E:/abc/#fileName#" action="unzip" filter="*.csv" destination="E:/abc/" />
person computeranalyst    schedule 30.05.2021

person    schedule
comment
Почему вы используете два списка? Вы можете покрыть его одним listlast и указать оба разделителя вместе. Например, это одно место, где listlast отличается от разделения java. Кроме того, зачем использовать structfind? cfhttp["responseHeader"]["Content-Disposition"] будет служить той же цели, поскольку StructFind() выдает исключение, если ключ не существует, так же как и прямой вызов. Однако это семантика, ответ в порядке, но listlast(cfhttp["responseHeader"]["content-disposition"],";=") достигнет той же цели. - person Regular Jo; 13.02.2015
comment
@cfqueryparam: Спасибо за ваше предложение. Я обновил свой ответ. - person Deepak Kumar Padhy; 13.02.2015