当我尝试使用 Coldfusion 网络服务上传文件时出现 Enctype 问题
Enctype issue when I try to upload a file with a Coldfusion webservice
无法运行在外部服务器中上传文件的 Coldfusion 网络服务。
我的应用程序在“服务器 A”中运行,文件存储库 (外部服务器) 在“服务器 B”中
模板(inicio.cfm)包含了<cfinput type="file">
到select客户要上传的文件的形式,存储在“服务器A”中。该模板执行的任务不仅仅是显示上传表单。它在表单的代码块之外执行计算、查询等。此外,此表单的操作页面就是模板本身(因为我的应用程序需要执行任务)。
我的表单定义的第一行代码是(在inicio.cfm内):
<cfform method="post" name="AltaConvocatoria" enctype="multipart/form-data">
这表明我使用的是正确的 enctype 定义。
另一方面,存储在“服务器 B”中的是我的 Coldfusion 组件 或 webservice (alta_ga.cfc)唯一的任务是上传文件 select 由用户以 "inicio.cfm" 形式编辑并重命名。
这里是alta_ga.cfc代码:
<cfcomponent>
<cffunction access="remote" returntype="void" name="cargaAnuncio">
<cfargument name="destinoAnuncio" required="yes" type="string">
<cfargument name="PrefijoNvoNombre" required="yes" type="string">
<cffile action="upload"
fileField="str_ArchivoAnuncio"
destination="#destinoAnuncio#"
nameconflict="Overwrite">
<cfset NvoNomAnuncio = #PrefijoNvoNombre# & #Right(cffile.ClientFile, 5)#>
<cfset viejoNombre1 = #destinoAnuncio# & #cffile.ClientFile#>
<cffile
action = "rename"
destination = "#NvoNomAnuncio#"
source = "#viejoNombre1#">
</cffunction>
</cfcomponent>
为此,我从 inicio.cfm 中表单的操作代码块调用 Web 服务:
<cfinvoke webservice="http://192.168.208.128/podi/mgmt/alta_ga.cfc?wsdl" method="cargaAnuncio" >
<cfinvokeargument name="destinoAnuncio" value="#form.destinoAnuncio#" />
<cfinvokeargument name="PrefijoNvoNombre" value="#form.PrefijoNvoNombre#" />
</cfinvoke>
当我尝试使用我的表单模板加载文件时 inicio.cfm 我收到此消息:
Cannot perform web service invocation cargaAnuncio.
The fault returned when invoking the web service operation is:
'' podi.mgmt.PodiMgmtAlta_gaCfcCFCInvocationExceptionException: coldfusion.tagext.io.FileUtils$CFFileNonMultipartException : Invalid content type: application/soap+xml; charset=UTF-8; action="urn:cargaAnuncio".The files upload action requires forms to use enctype="multipart/form-data".]
我使用的所有参数和变量都是正确的,因为我将 web 服务作为本地组件进行了测试(存储在服务器 A 中并在同一服务器中上传文件)并且工作正常。这是成功测试的代码(作为组件而不是 Web 服务调用):
<cfinvoke component="alta_ga" method="cargaAnuncio" destinoAnuncio="#form.destinoAnuncio#" PrefijoNvoNombre="#form.PrefijoNvoNombre#">
¿可能出了什么问题?
缺少有关此功能的文档。 Adobe 的用户指南没有详细解释此功能。 Ben Forta 的书……一样。或者我找不到相关信息。
提前致谢。
将表单 posted 到 CFML 服务器时,posted 文件会在您的任何代码运行之前保存在临时目录中。 <cffile action="upload">
所做的只是将文件 从该临时目录 复制到您想要的位置。您的远程服务器 ServerB
不知道 post 在 ServerA
上编辑的任何文件,因此 <cffile action="upload">
无法帮助您。
此操作具有误导性。这不是 upload
-ing 任何东西。它只是从预定的临时目录复制。 Web 服务器在 CF 服务器参与之前处理上传。
您可能需要 <cffile action="upload">
on ServerA
到特定位置,然后 它 需要 post 该文件到您的ServerB
上的网络服务。然后 ServerB
应该可以使用 <cffile action="upload">
将它从上传临时目录转移到任何你需要的地方。那就是说我在 post 连接到 Web 服务时从未尝试过。
或者您可以直接 post 将文件直接发送到 ServerB
,以节省需要 ServerA
作为中介。当然,这可能是不可能的。
无法运行在外部服务器中上传文件的 Coldfusion 网络服务。
我的应用程序在“服务器 A”中运行,文件存储库 (外部服务器) 在“服务器 B”中
模板(inicio.cfm)包含了<cfinput type="file">
到select客户要上传的文件的形式,存储在“服务器A”中。该模板执行的任务不仅仅是显示上传表单。它在表单的代码块之外执行计算、查询等。此外,此表单的操作页面就是模板本身(因为我的应用程序需要执行任务)。
我的表单定义的第一行代码是(在inicio.cfm内):
<cfform method="post" name="AltaConvocatoria" enctype="multipart/form-data">
这表明我使用的是正确的 enctype 定义。
另一方面,存储在“服务器 B”中的是我的 Coldfusion 组件 或 webservice (alta_ga.cfc)唯一的任务是上传文件 select 由用户以 "inicio.cfm" 形式编辑并重命名。
这里是alta_ga.cfc代码:
<cfcomponent>
<cffunction access="remote" returntype="void" name="cargaAnuncio">
<cfargument name="destinoAnuncio" required="yes" type="string">
<cfargument name="PrefijoNvoNombre" required="yes" type="string">
<cffile action="upload"
fileField="str_ArchivoAnuncio"
destination="#destinoAnuncio#"
nameconflict="Overwrite">
<cfset NvoNomAnuncio = #PrefijoNvoNombre# & #Right(cffile.ClientFile, 5)#>
<cfset viejoNombre1 = #destinoAnuncio# & #cffile.ClientFile#>
<cffile
action = "rename"
destination = "#NvoNomAnuncio#"
source = "#viejoNombre1#">
</cffunction>
</cfcomponent>
为此,我从 inicio.cfm 中表单的操作代码块调用 Web 服务:
<cfinvoke webservice="http://192.168.208.128/podi/mgmt/alta_ga.cfc?wsdl" method="cargaAnuncio" >
<cfinvokeargument name="destinoAnuncio" value="#form.destinoAnuncio#" />
<cfinvokeargument name="PrefijoNvoNombre" value="#form.PrefijoNvoNombre#" />
</cfinvoke>
当我尝试使用我的表单模板加载文件时 inicio.cfm 我收到此消息:
Cannot perform web service invocation cargaAnuncio.
The fault returned when invoking the web service operation is:
'' podi.mgmt.PodiMgmtAlta_gaCfcCFCInvocationExceptionException: coldfusion.tagext.io.FileUtils$CFFileNonMultipartException : Invalid content type: application/soap+xml; charset=UTF-8; action="urn:cargaAnuncio".The files upload action requires forms to use enctype="multipart/form-data".]
我使用的所有参数和变量都是正确的,因为我将 web 服务作为本地组件进行了测试(存储在服务器 A 中并在同一服务器中上传文件)并且工作正常。这是成功测试的代码(作为组件而不是 Web 服务调用):
<cfinvoke component="alta_ga" method="cargaAnuncio" destinoAnuncio="#form.destinoAnuncio#" PrefijoNvoNombre="#form.PrefijoNvoNombre#">
¿可能出了什么问题? 缺少有关此功能的文档。 Adobe 的用户指南没有详细解释此功能。 Ben Forta 的书……一样。或者我找不到相关信息。 提前致谢。
将表单 posted 到 CFML 服务器时,posted 文件会在您的任何代码运行之前保存在临时目录中。 <cffile action="upload">
所做的只是将文件 从该临时目录 复制到您想要的位置。您的远程服务器 ServerB
不知道 post 在 ServerA
上编辑的任何文件,因此 <cffile action="upload">
无法帮助您。
此操作具有误导性。这不是 upload
-ing 任何东西。它只是从预定的临时目录复制。 Web 服务器在 CF 服务器参与之前处理上传。
您可能需要 <cffile action="upload">
on ServerA
到特定位置,然后 它 需要 post 该文件到您的ServerB
上的网络服务。然后 ServerB
应该可以使用 <cffile action="upload">
将它从上传临时目录转移到任何你需要的地方。那就是说我在 post 连接到 Web 服务时从未尝试过。
或者您可以直接 post 将文件直接发送到 ServerB
,以节省需要 ServerA
作为中介。当然,这可能是不可能的。