更新:我找到了一种解决方法。如果我提交一个虚拟表单字段与文件一起使用。这是一个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>
我记得那个问题。我不确定规格,但我当时的_guess_是cfhttp问题。希望别人有一个更明确的答案.. – Leigh 2010-09-17 20:34:40
我的猜测是,这是一个浏览器或http问题,而不是CF的问题。在Mac Classic的IE浏览器中出现了类似的问题(是的,这已经有一段时间了),它会在任何multipart/mime格式中添加换行符。我想这是一个类似的,较少侵入性的问题。上传操作只是来自Web服务器(IIS,Apache等)提供的文件句柄的文件副本。 – 2010-09-17 21:22:11
您的建议会更有意义。但我仍然倾向于cfhttp问题。我只是用开发者版本(内置在web服务器上)来试用它,并且IE和FF也得到了相同的损坏文件结果。 – Leigh 2010-09-17 21:46:44