2010-09-17 21 views
6

Actualización: He encontrado una solución. Si envío un campo de formulario ficticio junto con el archivo, funciona. ¿Es esto un error de ColdFusion o hay algo en las especificaciones HTTP que dice que los formularios deben contener al menos un campo de formulario que no sea de archivo?Cargar un archivo con cfhttp agrega una nueva línea (incluso en archivos binarios)

Actualización 2: Estoy convencido de que se trata de un error ColdFusion cfhttp. Esto se basa en la respuesta de Leigh y el hecho de que he utilizado el código de abajo para enviar un formulario con única el elemento de archivo usando Javascript, y funciona bien:

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

Estoy corriendo en una problema al cargar archivos de un servidor ColdFusion a otro servidor web. Parece que cfhttpparam type="file" agrega indiscriminadamente una nueva línea (retorno de carro y avance de línea) al final del archivo. Esto está rompiendo archivos binarios. Esto no ocurre cuando subo manualmente el archivo a través del campo de formulario. Lo he intentado con y sin el parámetro mimetype, y he intentado mentir sobre el tipo de letra mimet con varios formatos binarios (exe, zip, jpg), pero nada ha funcionado. ¿Hay algún parámetro que me falta o es un error en ColdFusion? (Me estoy ejecutando en CF 8.0.1.195765 en WinXP.)

A continuación se muestra el código de prueba que estoy usando, simplemente carga el archivo en el mismo directorio. La carga manual funciona, pero la carga basada en el servidor termina agregando un CRLF al archivo.

<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

Recuerdo ese problema. No estoy seguro acerca de las especificaciones, pero mi _guess_ en ese momento era un problema. Con suerte, alguien más tiene una respuesta más definitiva. – Leigh

+0

Supongo que se trata de un problema de navegador o http, no es un problema con CF. Hubo un problema similar en IE en Mac Classic (sí, ha pasado un tiempo) que agregaría nuevas líneas a cualquier formulario multipart/mime. Supongo que este es un problema similar, menos intrusivo. la acción de carga es solo una copia de archivo del manejador de archivo proporcionado por el servidor web (IIS, Apache, etc.) –

+0

Su sugerencia tendría más sentido. Pero todavía me estoy inclinando hacia el problema de cfhttp. Acabo de probarlo con la versión de desarrollador (servidor web incorporado) y obtuve los mismos resultados de archivos dañados con IE y FF. – Leigh

Respuesta

4

o hay algo en la especificación HTTP que dice que las formas deben contener al menos un campo de formulario no archivo?

No lo sé con certeza. Pero de acuerdo con these definitions parece que un POST que contiene solo una entrada de archivo debe ser válido. Entonces sospecho que el problema puede ser CFHTTP en ACF.

De acuerdo con Fiddler, el contenido bruto de la llamada cfhttp en ACF contiene una nueva línea adicional justo antes del límite final (0D 0A en la vista hexadecimal). Pero bajo Railo no lo hace. Así que creo que el cfhttp de ACF podría ser el culpable.

Código de ejemplo:

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

Resultados 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-- 

Resultados ACF (versiones 8 y 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

gracias. fwiw, he enviado un informe de error a adobe – Kip

+0

@Kip - Bien, bien. Iba a preguntar sobre eso. Recuerdo haber visto este problema hace 2 años, y llegué a pensar que había un total de 2 bytes agregados a todos los archivos. Pero nunca entendí por qué. Así que gracias por incitarme a resolver el molesto misterio;) – Leigh

+0

@Kip - Por cierto: ¿Cuál es el número de error? No vi nada en el error público db. – Leigh

1

Tal Railo 3.1.2 y ColdFusion 9 mango esto un poco diferente, pero su código es un poco incorrecto para mí.

Su CGI.PATH_INFO no es aplicable aquí.

Mientras que el navegador es lo suficientemente inteligente como para usar la ruta sin el nombre de host, CFHTTP se siente mejor con nombre de host completo + ruta de acceso + nombre de script. Nota: cgi.SCRIPT_NAME funcionó en CF9, Railo requirió cgi.SERVER_NAME para ser anexado, aunque me parece más correcto en general.

Es por eso que una versión modificada del código funciona bien para mí. El archivo zip se carga y se publica sin corromperse.

Forma:

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

Espero que esto ayude.

+0

Lo intentaré con Railo. Pero cuando probé el código original, utilicé rutas codificadas y URL completas y obtuve los mismos resultados corruptos. Según Fiddler, el contenido en bruto de ACF cfhttp contiene 2 bytes adicionales (nueva línea). Tan pronto como agregue un campo ficticio _después_ del archivo, los bytes adicionales en el contenido sin formato desaparecerán. – Leigh

+0

lo siento, esto fue un error de mi parte durante el anonimato. en mi script local solo tengo la URL codificada. – Kip

+0

aún falla con '# cgi.SERVER_NAME ## cgi.SCRIPT_NAME #'. También he intentado usar javascript para enviar un formulario que contenga solo el elemento de archivo y funciona muy bien (ver mi edición). Así que estoy bastante seguro de que es un error en cfhttp. – Kip

1

Obtengo el avance de línea adicional y el retorno de carro en el archivo también. El problema para mí es/fue la combinación de cfhttp y cfloop. Una vez que rompí la creación del archivo en 3 partes: crear, cfloop endrow-1, y luego agregar el último registro.

Parece una manera bastante complicada de hacerlo, pero sin alimentación de línea adicional.

Cuestiones relacionadas