如何在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>
关键修改说明
- 文件元数据保存:调用文件URL后,提取并保存文件内容、Content-Type头信息,从URL中截取文件名(可根据实际场景调整文件名提取逻辑)。
- multipart请求头配置:设置
messageType和ContentType属性为multipart/form-data,指定分隔边界确保请求格式正确。 - 请求体构建:通过JavaScript脚本 mediator拼接表单字段和文件内容,严格遵循multipart/form-data的格式规范,确保每个部分的
Content-Disposition头正确。 - 上传API调用:新增
callmediator指向目标上传API地址,提交构建好的multipart请求。 - 故障处理:添加
faultSequence记录错误日志并返回响应,便于问题排查。
注意事项
- 若文件名包含特殊字符,需额外添加转义处理逻辑。
- 处理二进制文件(如图片)时,建议将
fileContent属性类型改为BINARY,并在脚本中调整二进制内容的处理方式,避免字符编码问题。 - 表单字段值和上传API地址需根据实际业务需求修改。
内容的提问来源于stack exchange,提问作者Pritish Mohanty
相关产品推荐
相关产品推荐

