これは InterSystems FAQ サイトの記事です。
ObjectScriptの%Netパッケージのライブラリクラスを利用して、ファイルを他のサーバーにアップロードすることができます。
以下のCurl コマンドと同じことを ObjectScript で実現する方法を紹介します。
curl -X POST "http://localhost/api/upload?a=123&b=999" -F file=@"C:/temp/a.csv"
クライアントのObjectScriptコードを以下の様に作成します。
// form-data (for CSV)
set msg= ##class(%Net.MIMEPart).%New()
set msg.ContentType = "multipart/form-data"
set inputstream=##class(%Stream.FileCharacter).%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/plain"
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")
If $$$ISERR(sc) Do $system.OBJ.DisplayError(sc) Quit
set res=req.HttpResponse
write res.Data.Read(1000)