web-services - 当我尝试使用 Coldfusion 网络服务上传文件时出现 Enctype 问题

标签 web-services file-upload coldfusion

无法使用在外部服务器上传文件的 Coldfusion 网络服务。

我的应用程序在“服务器 A”中运行,文件存储库(外部服务器)在“服务器 B”中

包含 <cfinput type="file"> 表单的模板 (inicio.cfm)选择要上传的客户端文件,存储在“服务器A”中。该模板执行的任务不仅仅是显示上传表单。它在表单的代码块之外执行计算、查询等。此外,此表单的操作页面是模板本身(因为我的应用程序需要执行任务)。

我的表单定义的第一行代码是(在 inicio.cfm 内):

<cfform method="post" name="AltaConvocatoria" enctype="multipart/form-data">

这表明我使用了正确的 enctype 定义。

另一方面,存储在“服务器 B”中的是我的 Coldfusion 组件或网络服务(alta_ga.cfc),其唯一任务是上传用户选择的文件以“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 中并在同一服务器中上传文件)并且工作正常。这是成功测试的代码(作为组件而不是网络服务调用):

<cfinvoke component="alta_ga" method="cargaAnuncio" destinoAnuncio="#form.destinoAnuncio#" PrefijoNvoNombre="#form.PrefijoNvoNombre#">

可能有什么问题? 缺少有关此功能的文档。 Adobe 的用户指南没有详细解释此功能。 Ben Forta 的书……一样。或者我找不到相关信息。 提前致谢。

最佳答案

当表单发布到 CFML 服务器时,发布的文件会在您的任何代码运行之前保存在一个临时目录中。全部<cffile action="upload">所做的是将文件从该临时目录 复制到您想要的位置。您的远程服务器 ServerB 不知道 ServerA 上发布的任何文件, 所以 <cffile action="upload">不会帮助你。

该操作具有误导性。这不是 upload - 任何东西。它只是从预定的临时目录复制。 Web 服务器在 CF 服务器参与之前处理上传。

您可能需要 <cffile action="upload">ServerA到特定位置,然后需要将该文件发布到您在 ServerB 上的网络服务.那么ServerB应该可以使用 <cffile action="upload">将它从上传临时目录转移到任何你需要的地方。那就是说我在发布到网络服务时从未尝试过。

或者您可以将文件直接发布到 ServerB首先,为了节省需要 ServerA做中介。当然,这可能是不可能的。

关于web-services - 当我尝试使用 Coldfusion 网络服务上传文件时出现 Enctype 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67544009/

相关文章:

asp.net - 在 FileUpload 控件中获取文件的扩展名

c# - 从上传的 Excel 文件中获取数据而不保存到文件系统

jquery - CFML Jquery Ajax - 当 cffunction 实际返回 18 时返回零

coldfusion - 如何检索 enablecfoutputonly 的当前值?

python - 如何在 Python 中限制对 Web 服务的请求速率?

web-services - 如何为 RESTful API 中的参数提供有效值列表?

javascript - 设置访问控制允许来源

html - IE8 输入文件中缺少浏览按钮?

coldfusion - structClear(session) 与 sessionInvalidate() 有何不同?

java - Façade - 接受对象实例,还是单独的参数?