記事
· 2025年3月4日 2m read

ObjectScriptを使用し、ローカルファイルを他のサーバーにアップロード(POST)する方法

これは InterSystems FAQ サイトの記事です。
 

ObjectScriptの%Netパッケージのライブラリクラスを利用して、ファイルを他のサーバーにアップロードすることができます。

以下のCurl コマンドと同じことを ObjectScript で実現する方法を紹介します。

curl -X POST "http://localhost/api/upload/csv?a=123&b=999" -F file=@"C:/temp/a.csv":/temp/a.csv"

クライアントのObjectScriptコードを以下の様に作成します。

Class User.MyRestClient Extends %Base
{

ClassMethod readMimeData() As %Status
{
    // form-data (for CSV)
    set msg= ##class(%Net.MIMEPart).%New()

    set msg.ContentType = "multipart/form-data"
    set inputstream=##class(%Stream.FileBinary).%New()
    set sc=inputstream.LinkToFile("c:¥temp¥a.csv")
    If $$$ISERR(sc) Do $system.OBJ.DisplayError(sc) Quit
    set filePart = ##class(%Net.MIMEPart).%New(inputstream)
    set filePart.ContentType = "text/csv; charset=utf-8"
    do filePart.SetHeader("Content-Disposition","form-data; name=""csvfile""; filename=""upload.csv"";")
    do msg.Parts.Insert(filePart) 
    set tempstream = ##class(%Stream.TmpCharacter).%New()

    set writer = ##class(%Net.MIMEWriter).%New()

    do writer.OutputToStream(.tempstream)

    do writer.WriteMIMEBody(msg)

    // POST with the above form-data
    set req=##class(%Net.HttpRequest).%New()

    set req.Server="127.0.0.1"
    set req.Port=80
    do req.SetParam("a","123")   ;; a=123
    do req.SetParam("b","999")   ;; b=999
    set req.EntityBody = tempstream

    set req.ContentType = "multipart/form-data; boundary="_msg.Boundary

    set sc = req.Post("/api/upload/csv")

    If $$$ISERR(sc) Do $system.OBJ.DisplayError(sc) Quit
    set res=req.HttpResponse

    write res.Data.Read(1000)
    quit $$$OK
}

}
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください