接收POST请求的Base64 文件
在此文章中将分享,当使用InterSystems IRIS 做后端时如何接收并保存通过POST方式发送过来的 Base64文件。
前后端之间传输文件,我认为较简单的方式是:前端将文件转为Base64格式,调用POST方法并将Base64内容附加在JSON消息中的一个参数中,在JSON消息中的另一个参数可以是文件名,比如消息定义如下:
{
"fileData": "JVBERi0xLjQKJdPr6eEKMSAwIG...",
"fileName": "example.pdf"
}在IRIS中,可以定义一个web application用于处理POST请求,同时定义一个分派类继承于%CSP.REST,在类中定义一个方法,具体保存文件。
代码示例:
ClassMethod SaveFile() As%Status
{
Try {
Do##class(%REST.Impl).%SetContentType("application/json")
If '##class(%REST.Impl).%CheckAccepts("application/json") Do##class(%REST.Impl).%ReportRESTError(..#HTTP406NOTACCEPTABLE,$$$ERROR($$$RESTBadAccepts)) Quit// Reading the body of the http call with the file dataset dynamicBody = {}.%FromJSON(%request.Content)
set dynamicStream = dynamicBody.%Get("fileData",,"stream<base64")
set stream=##class(%Stream.FileBinary).%New()
set sc=stream.LinkToFile("/shared/durable/"_dynamicBody.fileName)
set sc=stream.CopyFromAndSave(dynamicStream)
} Catch (ex) {
Do##class(%REST.Impl).%SetStatusCode("400")
Do##class(%REST.Impl).%WriteResponse(ex.DisplayString())
return {"errormessage": "Client error"}
}
Quit$$$OK
}下面具体解释下其中较重要的部分:
- 获取到请求的消息内容,并将其转化为%Library.DynamicAbstractObject对象,这样我们可以后面通过对象的方式进行处理
set dynamicBody = {}.%FromJSON(%request.Content) - 下面是比较重要的一步,我们将Base64 转化为 %Stream 类型,我们可以直接通过%Library.DynamicObject类下面的%Get方法实现
set dynamicStream = dynamicBody.%Get("fileData",,"stream<base64")要注意的一点是,这里我们完全可以绕过了string 常常遇到的MAXSTRING 错误,因为我们直接将Base64转化为stream.
- 最后,我们在服务器上创建了一个文件,内容来自传进的Base64,文件名也来自于传入的JSON消息
set stream=##class(%Stream.FileBinary).%New() set sc=stream.LinkToFile("/shared/durable/"_dynamicBody.fileName) set sc=stream.CopyFromAndSave(dynamicStream)