При загрузке файла с помощью cfhttp добавляется новая строка (даже для двоичных файлов) - PullRequest
6 голосов
/ 18 сентября 2010

Обновление : я нашел обходной путь. Если я отправляю фиктивное поле формы вместе с файлом, это работает. Это ошибка ColdFusion, или в спецификации HTTP указано, что формы должны содержать хотя бы одно нефайловое поле формы?

Обновление 2 : Я уверен, что это ошибка ColdFusion cfhttp. Это основано на ответе Ли и том факте, что я использовал приведенный ниже код для отправки формы с только элементом файла, используя javascript, и он отлично работает:

<form enctype="multipart/form-data" action="<cfoutput>#CGI.PATH_INFO#</cfoutput>" method="POST" name="theForm">
  <input name="theFile" type="file" /><br/>
</form>
<a href="#" onclick="document.theForm.submit()">submit</a>

У меня проблема с загрузкой файлов с сервера ColdFusion на другой веб-сервер. Кажется, что cfhttpparam type="file" без разбора добавляет новую строку (возврат каретки и перевод строки) в конец файла. Это ломает бинарные файлы. не происходит, когда я вручную загружаю файл через поле формы. Я пробовал с параметром mimetype и без него, и я пытался лгать о mimetype с различными двоичными форматами (exe, zip, jpg), но ничего не помогло. Есть какой-то параметр, который я пропускаю, или это ошибка в ColdFusion? (Я работаю на CF 8.0.1.195765 на WinXP.)

Ниже приведен тестовый код, который я использую, он просто загружает файл в тот же каталог. Загрузка вручную работает, но загрузка с сервера заканчивается добавлением CRLF в файл.

<cfset MyDir = "C:\test" />
<cfset MyFile = "test.zip" />

<cfif IsDefined("Form.TheFile")>
  <cffile action="upload" fileField="theFile" destination="#MyDir#" nameConflict="MakeUnique" />
<cfelse>
  <cfhttp url="http://#CGI.SERVER_NAME##CGI.SCRIPT_NAME#" method="POST" throwOnError="Yes">
    <cfhttpparam type="file" name="theFile" file="#MyDir#\#MyFile#" />
  </cfhttp>
</cfif>

<html><body>
<h2>Manual upload</h2>
<form enctype="multipart/form-data" action="<cfoutput>#CGI.PATH_INFO#</cfoutput>" method="POST">
  <input name="theFile" type="file" /><br/>
  <input type="submit" value="Submit" />
</form>
</body></html>

Ответы [ 3 ]

4 голосов
/ 19 сентября 2010

или в спецификации HTTP есть что-то, что формы должны содержать хотя бы одно не файловое поле формы?

Я точно не знаю.Но согласно этим определениям кажется, что POST, содержащий только входные данные файла, должен быть действительным.Поэтому я подозреваю, что проблема может быть CFHTTP в ACF.

Согласно Fiddler необработанный контент из вызова cfhttp в ACF содержит дополнительную новую строку непосредственно перед границей конца (0D 0A в шестнадцатеричном представлении).Но под Рейло это не так.Поэтому я думаю, что cfhttp ACF может быть виновником.

Пример кода:

<cfhttp url="http://127.0.0.1:8888/cfusion/receive.cfm" method="post">
    <cfhttpparam name="myFile" type="file" file="c:/test/testFile.zip" mimetype="application/octet-stream" />
</cfhttp>

Результаты Railo 3.1.2

POST /railo/receive.cfm HTTP/1.1
User-Agent: Railo (CFML Engine)
Host: 127.0.0.1:8888
Content-Length: 382
Content-Type: multipart/form-data; boundary=m_l7PD5xIydR_hQpo8fDxL0Hb7vu_F8DSzwn

--m_l7PD5xIydR_hQpo8fDxL0Hb7vu_F8DSzwn
Content-Disposition: form-data; name="myFile"; filename="testFile.zip"
Content-Type: application/octet-stream; charset=ISO-8859-1
Content-Transfer-Encoding: binary

PK
&�1=�cN'testFile.txtTestingPK
&�1=�cN' testFile.txtPK:1
--m_l7PD5xIydR_hQpo8fDxL0Hb7vu_F8DSzwn--

Результаты ACF (версии 8 и 9)

POST /cfusion/receive.cfm HTTP/1.1
Host: 127.0.0.1:8888
... other headers removed for brevity ....
Content-type: multipart/form-data; boundary=-----------------------------7d0d117230764
Content-length: 350

-------------------------------7d0d117230764
Content-Disposition: form-data; name="JobFile"; filename="c:\test\testFile.zip"
Content-Type: application/octet-stream

PK
&�1=�cN'testFile.txtTestingPK
&�1=�cN' testFile.txtPK:1

-------------------------------7d0d117230764--
1 голос
/ 07 апреля 2011

Я получаю дополнительный перевод строки и возврат каретки при добавлении файла. Проблема для меня была / была комбинация cfhttp и cfloop. Как только я разбил создание файла на 3 части: Create, cfloop endrow-1, затем добавление последней записи.

Похоже на хитрый способ сделать это, но без дополнительной строки.

1 голос
/ 18 сентября 2010

Возможно, Railo 3.1.2 и ColdFusion 9 справляются с этим немного по-разному, но ваш код выглядит для меня немного некорректно.

Ваш CGI.PATH_INFO здесь не применим.

Хотя браузер достаточно умен, чтобы использовать путь без имени хоста, CFHTTP чувствует себя лучше с полным именем хоста + путь к сценарию + имя сценария. Примечание: cgi.SCRIPT_NAME работал в CF9, Railo требовал добавления cgi.SERVER_NAME, хотя в целом я чувствую, что это более правильно.

Вот почему немного измененная версия кода прекрасно работает для меня. Zip-файл загружен и опубликован без повреждений.

Форма:

<form enctype="multipart/form-data" action="<cfoutput>#cgi.SCRIPT_NAME#</cfoutput>" method="POST">
  <input name="theFile" type="file" /><br/>
  <input type="submit" value="Submit" />
</form>

CFHTTP:

  <cfhttp url="#cgi.SERVER_NAME##cgi.SCRIPT_NAME#" method="POST" throwOnError="Yes">
    <cfhttpparam type="file" name="theFile" file="#MyDir#/#MyFile#" />
  </cfhttp>

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

...