· Oct 7, 2016

Setting properties on GlobalBinary stream


I have been working on changing a web application from using %FileBinaryStream to storing and serving the file content from a %Stream.GlobalBinary property, stored in a new database.  I have managed to migrate the data across, and have also been able to redirect the stream so that it is being served through the web link.  However, the previous method set attributes on the File stream to have the stream be rendered as the original file type through MIME, using this code

do stream.SetAttribute("ContentDisposition","inline; filename="_filecvt)

This method is not supported by %Stream.GlobalBinary, and I can't see a way in the documentation to add this sort of attribute to the stream.  How can I have the stream render as the original "file"?



Discussion (2)2
Log in or sign up to continue

The %Stream.GlobalBinary/GlobalCharacter doesn't support to add/save Attributes. You would need to use the %Library stream classes to be able to do it - %Library.GlobalBinaryStream/%Library.GlobalCharacterStream.

The reason is in difference how the ID of the stream is created and saved in persistent data. For %Stream.GlobalBinary/GlobalCharacter only the ID number is stored in database, while for %Library.GlobalBinaryStream/%Library.GlobalCharacterStream the full OID is saved to database and it contains also name of the global (=stream location) and type of the stream. The ID of such stream contains also all added attributes.

Here is an example:

 Class Test.streamtest Extends %Persistent
Property Stream1 As %Stream.GlobalCharacter;

Property Stream2 As %GlobalCharacterStream;

ClassMethod FillData() As %Status
  // kill existing data
 DO ##class(Test.streamtest).%KillExtent()
 KILL ^Test.streamtestS
  // create a new record
 SET obj=##class(Test.streamtest).%New()
 DO obj.Stream1.Write("Stream1 data")
 DO obj.Stream2.Write("Stream2 data")
 DO obj.Stream2.SetAttribute("ContentDisposition","inline; filename=test.txt")
 SET sc=obj.%Save()
  // display id of streams
 SET id1=obj.Stream1.%Id() ZWRITE id1
 SET id2=obj.Stream2.%Id() ZWRITE id2
  // display stored data
 WRITE ! ZWRITE ^Test.streamtestD,^Test.streamtestS
 QUIT sc


And result:

USER>d ##class(Test.streamtest).FillData()
"ContentDisposition"_$c(27,1)_"inline; filename=test.txt"
"ContentDisposition"_$c(27,1)_"inline; filename=test.txt","%Library.GlobalCharacterStream"))
^Test.streamtestS(1,1)="Stream1 data"
^Test.streamtestS(2,1)="Stream2 data"