当我尝试使用 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 作为中介。当然,这可能是不可能的。