2010-09-17 48 views
6

更新:我找到了一种解决方法。如果我提交一个虚拟表单字段与文件一起使用。这是一个ColdFusion错误,还是HTTP规范中的某些内容表明表单必须至少包含一个非文件表单域?使用cfhttp上传文件追加换行符(即使在二进制文件上)

更新2:我确信这是一个ColdFusion cfhttp错误。这是基于Leigh的答案,我用下面的代码中使用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服务器上传到另一个Web服务器。看起来,cfhttpparam type="file"是无差别地将一个换行符(回车和换行符)附加到文件的末尾。这是打破二进制文件。这个不会当我通过表单域手动上传文件时发生。我尝试过使用和不使用mimetype参数,并且我尝试过使用各种二进制格式(exe,zip,jpg)说谎mimetype,但没有任何工作。是否有一些参数我错过了,或者这是ColdFusion中的一个错误? (我在WinXP的CF 8.0.1.195765上运行。)

下面是我正在使用的测试代码,它只是将文件上传到同一个目录。手动上传工作,但基于服务器的上传最终将追加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> 
+0

我记得那个问题。我不确定规格,但我当时的_guess_是cfhttp问题。希望别人有一个更明确的答案.. – Leigh 2010-09-17 20:34:40

+0

我的猜测是,这是一个浏览器或http问题,而不是CF的问题。在Mac Classic的IE浏览器中出现了类似的问题(是的,这已经有一段时间了),它会在任何multipart/mime格式中添加换行符。我想这是一个类似的,较少侵入性的问题。上传操作只是来自Web服务器(IIS,Apache等)提供的文件句柄的文件副本。 – 2010-09-17 21:22:11

+0

您的建议会更有意义。但我仍然倾向于cfhttp问题。我只是用开发者版本(内置在web服务器上)来试用它,并且IE和FF也得到了相同的损坏文件结果。 – Leigh 2010-09-17 21:46:44

回答

4

或者是有什么在说形式必须至少包含 一个非文件,表单字段的HTTP规范 ?

我不确定。但根据these definitions看来,只包含文件输入的POST应该是有效的。所以我怀疑这个问题可能是ACF中的CFHTTP。

根据Fiddler来自ACF中cfhttp调用的原始内容在结束边界(十六进制视图中的0D 0A)之前包含一个额外的新行。但在Railo下它并不是。所以我认为ACF的cfhttp可能是罪魁祸首。

示例代码:

<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-- 
+0

谢谢。 fwiw,我已经向adobe提交了一个bug报告 – Kip 2010-09-18 21:35:04

+0

@Kip - 好的,很好。我会问这个。我记得大约两年前看到这个问题,并且发现还有一个额外的2字节被添加到所有文件中。但从来没有搞清楚为什么。所以感谢提醒我解决谜团;) – Leigh 2010-09-19 01:14:55

+0

@Kip - 顺便说一句:什么是错误号?我在公共bug数据库中没有看到任何东西。 – Leigh 2010-09-19 01:49:02

1

也许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> 

希望这有助于。

+0

我会用Railo试一试。但是当我测试原始代码时,我使用了硬编码路径和完整的url,并且仍然得到了相同的损坏结果。根据Fiddler,来自ACF cfhttp的原始内容确实包含额外的2个字节(新行)。只要在文件后添加一个虚拟字段,原始内容中的额外字节就会消失。 – Leigh 2010-09-18 18:44:24

+0

对不起,这在我的匿名过程中是一个错误。在我的本地脚本中,我只是将网址硬编码。 #cgi.SERVER_NAME ## cgi.SCRIPT_NAME#'仍然会失败,因此 – Kip 2010-09-18 21:00:02

+0

仍然失败。我也尝试使用JavaScript来提交一个只包含文件元素的表单,它工作得很好(请参阅我的编辑)。所以我很确定这是cfhttp中的一个错误。 – Kip 2010-09-18 21:23:39

1

我得到多余的换行符和回车文件也会附加。对我来说问题是/是cfhttp和cfloop的结合。一旦我将文件创建分为三部分:创建,cfloop endrow-1,然后追加最后一个记录。

看起来像一种方式来做到这一点,但没有额外的换行符。

相关问题