You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WSO2中通过图片URL以multipart/form-data格式上传文件

实现从URL获取文件并以multipart/form-data提交至上传API的WSO2配置

需求说明

  • 从指定URL获取文件
  • 将获取到的文件以multipart/form-data格式提交至文件上传API(对应示例curl请求)

修改后的完整API配置

<api context="/processFile" name="processFile" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <!-- 提取请求中的文件URL -->
            <property expression="$body//url" name="uri.var.fileUrl" scope="default" type="STRING"/>
            <!-- 获取文件内容 -->
            <call>
                <endpoint>
                    <http method="get" uri-template="{uri.var.fileUrl}">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </http>
                </endpoint>
            </call>
            <!-- 保存文件内容和类型 -->
            <property name="fileContent" expression="$body" scope="default" type="OM"/>
            <property name="fileContentType" expression="$trp:Content-Type" scope="default" type="STRING"/>
            <!-- 从URL截取文件名,可根据需求自定义逻辑 -->
            <property name="uri.var.fileName" expression="fn:substring-after(fn:substring-after($ctx:uri.var.fileUrl, '/'), '/')" scope="default" type="STRING"/>
            
            <!-- 重置上下文,准备构建multipart请求 -->
            <payloadFactory media-type="xml">
                <format>
                    <root/>
                </format>
                <args/>
            </payloadFactory>
            <property name="messageType" value="multipart/form-data" scope="axis2"/>
            <property name="ContentType" value="multipart/form-data; boundary=----WSO2MediatorBoundary" scope="axis2"/>
            
            <!-- 定义表单字段值,可根据需求动态获取 -->
            <property name="companyId" value="100" scope="default" type="STRING"/>
            <property name="companyName" value="google" scope="default" type="STRING"/>
            <property name="website" value="google.com" scope="default" type="STRING"/>
            
            <!-- 构建符合规范的multipart请求体 -->
            <script language="js">
                var fileContent = mc.getProperty("fileContent");
                var fileContentType = mc.getProperty("fileContentType");
                var fileName = mc.getProperty("uri.var.fileName");
                var companyId = mc.getProperty("companyId");
                var companyName = mc.getProperty("companyName");
                var website = mc.getProperty("website");
                
                var boundary = "----WSO2MediatorBoundary";
                var payload = "";
                
                // 添加companyId表单字段
                payload += "--" + boundary + "\r\n";
                payload += "Content-Disposition: form-data; name=\"companyId\"\r\n\r\n";
                payload += companyId + "\r\n";
                
                // 添加companyName表单字段
                payload += "--" + boundary + "\r\n";
                payload += "Content-Disposition: form-data; name=\"companyName\"\r\n\r\n";
                payload += companyName + "\r\n";
                
                // 添加website表单字段
                payload += "--" + boundary + "\r\n";
                payload += "Content-Disposition: form-data; name=\"website\"\r\n\r\n";
                payload += website + "\r\n";
                
                // 添加文件部分
                payload += "--" + boundary + "\r\n";
                payload += "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n";
                payload += "Content-Type: " + fileContentType + "\r\n\r\n";
                payload += fileContent.toString() + "\r\n";
                
                // 结束multipart边界
                payload += "--" + boundary + "--\r\n";
                
                mc.setPayloadXML(new XML("<root>" + payload + "</root>"));
            </script>
            
            <!-- 调用文件上传API -->
            <call>
                <endpoint>
                    <http method="post" uri-template="http://localhost:8290/upload/form">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </http>
                </endpoint>
            </call>
            
            <!-- 返回上传API的响应结果 -->
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence>
            <log level="full"/>
            <respond/>
        </faultSequence>
    </resource>
</api>

关键修改说明

  1. 文件元数据保存:调用文件URL后,提取并保存文件内容、Content-Type头信息,从URL中截取文件名(可根据实际场景调整文件名提取逻辑)。
  2. multipart请求头配置:设置messageType和ContentType属性为multipart/form-data,指定分隔边界确保请求格式正确。
  3. 请求体构建:通过JavaScript脚本 mediator拼接表单字段和文件内容,严格遵循multipart/form-data的格式规范,确保每个部分的Content-Disposition头正确。
  4. 上传API调用:新增call mediator指向目标上传API地址,提交构建好的multipart请求。
  5. 故障处理:添加faultSequence记录错误日志并返回响应,便于问题排查。

注意事项

  • 若文件名包含特殊字符,需额外添加转义处理逻辑。
  • 处理二进制文件(如图片)时,建议将fileContent属性类型改为BINARY,并在脚本中调整二进制内容的处理方式,避免字符编码问题。
  • 表单字段值和上传API地址需根据实际业务需求修改。

内容的提问来源于stack exchange,提问作者Pritish Mohanty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:47:28