文章
· 十二月 24, 2023 阅读大约需 2 分钟

接收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 data
        set 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
}

下面具体解释下其中较重要的部分:

  1. 获取到请求的消息内容,并将其转化为%Library.DynamicAbstractObject对象,这样我们可以后面通过对象的方式进行处理
    set dynamicBody = {}.%FromJSON(%request.Content)
     
  2. 下面是比较重要的一步,我们将Base64 转化为 %Stream 类型,我们可以直接通过%Library.DynamicObject类下面的%Get方法实现
    set dynamicStream = dynamicBody.%Get("fileData",,"stream<base64")
    要注意的一点是,这里我们完全可以绕过了string 常常遇到的MAXSTRING 错误,因为我们直接将Base64转化为stream.
  3. 最后,我们在服务器上创建了一个文件,内容来自传进的Base64,文件名也来自于传入的JSON消息
    set stream=##class(%Stream.FileBinary).%New()
    set sc=stream.LinkToFile("/shared/durable/"_dynamicBody.fileName)
    set sc=stream.CopyFromAndSave(dynamicStream)
     
讨论 (0)1
登录或注册以继续