« Macromedia Product Manager Interviewed on SYS-CON Radio | Main | On My Way to CFUN 2003 »
June 19, 2003
Another Way to Serve Binary Data
I made a post recently on using ColdFusion to write out binary data to the output stream in order to allow me to serve an image or other binary file that doesn't exist on disk. The original code I posted looked like this:
<cffile action="readbinary" file="/home/cantrell/Pictures/Corrs2.jpg" variable="pic"/>
<cfscript>
context = getPageContext();
context.setFlushOutput(false);
response = context.getResponse().getResponse();
out = response.getOutputStream();
response.setContentType("image/jpeg");
response.setContentLength(arrayLen(pic));
out.write(pic);
out.flush();
out.close();
</cfscript>
In the example above, I'm reading the file from disk, but in a real-life situation, I would be getting the bytes from a URL or a database. Anyway, Spike Washburn (you guys know Spike?) was able to reduce the code above to just this:
<cffile action="readbinary" file="/home/cantrell/Pictures/Corrs2.jpg" variable="pic"/>
<cfcontent type="image/gif; charset=8859_1">
<CFSCRIPT>
writeOutput(toString(pic));
</cfscript>
Very cool concept. (Hint: the key is in the character encoding.) Thanks for the fresh perspective, Spike!
Posted by cantrell at June 19, 2003 5:15 PM
Comments
This is one of the best things I've heard about CFMX. On it's own it's a compelling reason to upgrade from previous versions. Nice one!
Posted by: Spike (Milligan) at June 19, 2003 9:15 PM
what the heck encoding is that?
Posted by: PaulH at June 20, 2003 12:17 AM
Great concept! I've recently been trying to figure out how to accomplish this myself. Until reading this, I was about to give up and just build the function in PHP.
In terms of a "real life" example, how would one go about creating the image file based on a URL or database?
Consider a page visit tracking application as an example. The script could be called via an tag in the requesting page.
When called, a database field would be incremented by +1 to log the visit and then return the total number of visits. Whatever that number is, you'd convert to an image and stream it back to the client browser on the other end.
Thanks for sharing...
Bob
Posted by: Bob at June 21, 2003 12:59 AM
wow thanks
Posted by: tematics at June 21, 2003 2:52 PM
Just so you all know: the technique posted by Spike doesn't required CFMX at all - anything 4.5+ will support it just fine.
For example here's a template that will return a single-pixel, transparent GIF file to the browser. Note that graphic was previously conveted to Base64 and is used like that: this template is completely self contained - no "source" graphic is needed:
#ToString(ToBinary("R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="))#
Posted by: jim Davis at June 24, 2003 4:49 PM
I am trying to display generated PDFs without having to write them to a file. I'm using the iText Java package to generate the PDFs.
I tried what Spike suggested above, but can't convert the binary data into a sting due to there being bytes with a value of 0. I'm using CF 5, and as Jim Davis suggested, it should work.... I checked out the online docs for CFMX, and it includes the clause about being unable to convert 0 value bytes, just like CF 5...
So, is it just a feature of CFMX that lets it work or am I doing something wrong?
Any suggestion, or even better ideas would be great!
I'm glad I found this great info and site....
Thanks in advance,
Greg
Posted by: Greg Welych at June 27, 2003 1:19 PM
Jim Davis wrote:
> Just so you all know: the technique posted
> by Spike doesn't required CFMX at all -
> anything 4.5+ will support it just fine.
I tried your example in cf 4.5.2 it didnt work, when attempting to output your code the following error occurs:
An error occurred while evaluating the expression:
#ToString(ToBinary("R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="))#
Error near line 2, column 2.
--------------------------------------------------------------------------------
This object cannot be converted to a string (it contains null characters).
The error occurred while processing an element with a general identifier of (#ToString(ToBinary("R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="))#), occupying document position (2:1) to (2:84) in the template file c:\inetpub\wwwroot\test\outputgif.cfm.
Posted by: steve at July 10, 2003 8:50 AM
If I put
#ToString(ToBinary("R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="))#
into a template, the webpage only ouputs:
GIF89a
Is this what you mean?
Posted by: Amund at July 11, 2003 7:20 AM
I have a question relevant to this.
First some info:
I use Oracle 9i/intermedia database, where I store videos as ORDVideos. I have made a procedure in Oracle that looks like this:
create or replace procedure getBlob(p_cursor in out types.cursorType)
as
obj ordsys.ordvideo;
begin
select v.video into obj from video v where v.identifier = 20;
open p_cursor for select obj.getContent() from video where identifier = 20;
end;
This procedure returns the BLOB, i.e. the binary data of the one video I have stored in the DB for testing purposes.
I can then in CFMX do this:
#vidBlob.recordcount#
However, I can't know the columnname of the resultset from the stored procedure - this means that I can't do
#columnName_Which_contains_Blob#
to output the binary data.
If I write #vidBlob.columnlist# within the cfoutput tags, the webpage outputs:
(:B1).GETCONTENT()
as the columnheader. This seems strange to me.
Does any of you know how to actuallt read the binary data, convert it to the right MIME type and the ouput the video, or image for that matter, as portayed above?
Best regards,
Amund
Posted by: Amund at July 11, 2003 9:23 AM
Hi,
where can I find more info about the setFlushOutput function?
I wasn't able to find anything about it on the web and CF/JRun documentation?
Also, when outputting BLOB from an Oracle database directly to the client browser, sometimes I get an error on the line (24) "out.flush();":
***
null null
The error occurred on line 24.
***
The client browser still receives fine the file.
Any idea?
How do I fix the error?
Thanks!
Posted by: thewolf at August 12, 2003 11:57 AM
I hope people are still reading this....I've Googled til I just can't Google no more, and for the life of me I can't find a single example of an instance where you would:
1) Upload an image file to the server using a form;
2) Save that file to an image field in the database (my company uses MS Access -- help!)
3) Pull the file down dynamically using CFCONTENT.
I've found examples of parts 1 and 2 (though seemingly none that work) and the code posted here serves part 3. I've tried some variations, but nothing seems to work. Any help would be much appreciated. Code sample is at http://www.sitemanageware.com/testing/badcode.htm
Thanks!
Posted by: Kyle at October 7, 2003 1:09 AM
ok this one works fine with myslq cfMX
form:
=============================
<form action="upload.cfm" method="post" enctype="multipart/form-data">
name <input type="text" name="name"><br>
file <input type="file" name="filename"><br>
<input type="Submit">
</form>
insert:
=============================
<cffile
action = "upload"
fileField = "filename"
destination = "#expandpath(".")#"
nameConflict = "makeunique">
<cffile
action = "readBinary"
file = "#file.serverdirectory#/#file.serverfile#"
variable = "thefile" >
<cfquery name="upl"
datasource="cms"
dbtype="odbc">
INSERT INTO document (
document_name ,
doc_base64 )
VALUES (
'#file.serverfile#'
'#toBase64(thefile)#',
)
</cfquery>
<cffile
action = "delete"
file = "#file.serverdirectory#/#file.serverfile#">
show
=============================
<cfsetting enablecfoutputonly="Yes">
<cfsetting showdebugoutput="No">
<cfquery name="upl"
datasource="cms"
dbtype="odbc">
SELECT * from document
where document_id = #id#
</cfquery>
<cfheader name="content-disposition" value="Inline;filename=#upl.document_name#">
<cfcontent type="#upl.file_mime#">
<cfoutput query="upl">#tostring(tobinary(upl.doc_base64))#</cfoutput>
Posted by: paul at October 15, 2003 12:37 PM
After test this script below IE show me only a string wit huggly chars.
Should be my uploaded image,wright?
Best regards
Posted by: Marco at January 9, 2004 10:18 AM
Can i use the same concept above to create image files from XML data?
I have a set of XML files containing hexadecimal image data. I have created the code to extract the data and require to create an image from it and store the image on the server and the filename in the database.
An example of the image data :
0xFFD8FFE000104A46494600010101006400640000FFDB0043000A06060707070A08080A0E0A080A0E110D0A0A0D11130F0F100F0F131611121212121116131617181716131D1D1F1F1D1D29282828292B2B2B2B2B2B2B2B2B2BFFDB0043010B0A0A0F0E0F1711111719141214191F1D1D1D1D1F231F1F1F1F1F232622202020202226242523232325242828262628282B2B2B2B2B2B2B2B2B2B2B2B2B2B2BFFC000110800BB010103011100021101031101FFC4001B00000203010101000000000000000000000405020306000107FFC4004A10000103020402070602060707030500000102031100040512213113410614223251617123428191A1B152C115336272D1E1072443538292F016345455A2D2F193B2C22535446394FFC4001A010002030101000000000000000000000002030001040506FFC4002A11000202020202010402020301000000000001020311120421133122143241510561152333427152FFDA000C03010002110311003F00F53076D6B88BD9D0667984EA4F9D6B5E8288E2D13596C1C86084E86B2B188B6C18C8B7560F61C8EC798DCD69AE622C1A3103D6AF716CBD6B7823D88057E7CA84A284B441CEBD567759E5F0A84185B34D0ED839D7E277F85428312E46A7978ED460942EF40DBFD7A0A0C847894BCF99DBCCFE55304096AC9B46A753478049A9F423CFC854D88721F2A3B6956517A5417FC288120A635A2C1601FA5992DBAB6C05E404A2160ACC7EC7DBEB534045F778B2D02DDF19CADE1C0111C624BB223972A6E0816FE3A18280639032722C9263B29A4E841964F13F2A0C064929036A22115280AA2CA54F8E5AD4215296B56DA501654A4FE3D6A10A5FCFC33C1580BE448915114647A42EE2ED210C5B626F5D5F15A21A611A78AB44C7C04FAD6BAF02A6D8B31BE915CD8585B96E46268EC7156F079F5C9D476354FA1F855AAD03BB175EE24CBB636D725E75E58CEB4680E43EF1236CDCB59D35A628839132ED995B25F5A108B8419C9A85F0D6252B091F3FBE946806297D686A5BB578965C03892224EF14608151027D6D2A0B19D1A8E4B15C9FC9D362A613B537F01446D689ACD60E4306F63F1ACAC6A084A0E40791A7404D85A852C6BC8558B612D3F56560290B0BF3AA216F081D4686ACA394C3CB235D3C7F851025CD30CB424EA7F1AEA6084D57A0688D7ED532420A7C9EF9F855EC43C4AE76A840861279D42166A28C02C4A8ED4C4C823C430DB8B7B6475086508994123FE9E7DAE7ACD3500529C3501D45CAEE16BBA003DC23FAB057A2BB3B7748AA6C84F09B473ADBC87A5E4021664FB3CFB295075F02055B20ED4A20C0931A49E6692C320A52CF9503642A527C75A10C829D6D1B9153242A53E55B027CCE8280B29529E3B903F73F89A85905340EFA9F3D684200C7EE6C6D70E7BAEAF25BAC642841C8B5E7F75314D86C2A6D18DB9E963230C37387E1ECDB2D6B5B2D442DC0088CD1947CE74ADD1833339A105CAAD1F08719645AB5AE400F6069DA52F349F4FA5394406C4E8377ADA82B085CAFC3BE399F348DA88A04754D890D810635E623C0F9D102559175651F4D18B3C4AD6F3235264A3B02664E874F91AE56BD9D0216DCA98D741A1B5B26B1586880C109EC5661A456F968E492040F4D69E919EC2687C9FE55010C6139880892498000D6888D8D13825DA0770D1F864C5F9115A90EA0EA2978683E9934BBE35592B04D6A0B106AF2503A52E1240DBC688810863C4FC05160992E440D854C0010949A348AC96A52698A256421A60AC1234AD51A854A60CFE1608E1AF9C7D399356E00265CFE1EC8217BCFDB6A29442522A4E12601993A6BE874140A046CB5F68A3949E74BB6192D3025A5EF21F5ACF28606A60EA689DC93E5B7DA9390F2491687DC4556AD93726AC3DE898A8EB689198BF10BCB4C32D96F5D101A1B9DCCF202A9209B165CDDE2EBF6D6C19B5B7107FAD9D63795A4777D269D5C20FD8A936612F710B7B85DDDCBD17974B20EA727737C80CFC08E55B1471E8449B329883E6E194E72406E4EB242F39DC0DAB4A144F0BC4AEF0C50719B8016B41C8203D276CAA0A9144421D691D58645FB5D56F0234CF3DD11E550A0173B5AC413A9F3A842AAB28FA661683D4F39904CE86B9B266D8B2DB66B4143291A22867689AC760E80C12986EB28D15E37885FA0845AA00582256E6A85A23BBCAB7D35E5192C65D738858B36CBB912BC912CA0439A98395262ABC7D9591B61EEC5BA2F1B272101C40220C1D685CB565491B16B18B34368E33A1B5AFB00120673E026BA35F263A9965532BC4AE594895A01F0F1ACB7DA86D698954FB2B3E1EB583391CD12CBE703E94C459DC58A321C9BB157B03807BEBE71A08E02C093AACEB1E82A6C1A81ED95F5C9DEE27E028636F65CEAC1A4C2D41F673AD6091CC57538EB28C73E8B9F5ADA9E0C11E04C7D6B4644305EBAF3E2568C8412379DB9D2A730A312BD90216BCFCE4E9E3A503B02489A6F6EC85F6101A47BF249F294FF003A38CC8D05B06519DF224EE76146BB01B07BD533EE19F4ACDC8E86D6C5AA7C20EDF3AC191F1430B2BD64A092B080373B0F89AD74CD0AB11D778858A5D2C7166E00981AFD76F85339328E0903378826497CA38840EC20ED133CF4F8D73BC9D9A306671BBBC42F1E4599B716D65910FDD878E75AD0B3D9ECA7B5DA88CA35F1ADD552976CCF2C9987F0BE13CCB2DA05ABAC83D61625682567B3E27372F0AD0988964CFDF5CA1A6DD616B2F0265089D97EF1736F853D000CAB9B15AC1EAE508800A10749037075F5344423945B843C087839B8076D76350A2ABB5A1464680EB906C83E15080D5651F584BA10D90505060EE08FAED5C74CDD147309D05491AA23161359663A217961B1480909FA66C32BB3B69139DDD758D8575388BE273F92FE4431B5376E0AD91027218D221D437206DCE8D2EC0D836D2D2E11870B945C112804A0FBF9FC87AD22781898E1F7F1945BF56BCB766E5123B6D919C807BBE3FF004D1401932A56378702B4142ED5732B6960933E7CFE949B2A6C38CF0178230D62C5659B868211A093A93E693523C56C92B4AAF1C36B726DA415A34392797AD0CEAD028C81D57CB1CFE74BF6330775B3126ACA472561F30758D4505C32B19B09F674AAD96C975EB442D085822ED64146872641BA551A57638EFA31583662ED77AC9007B21ACCEBB4FDEB46E28EC3EE5960143C65676CFA99E60C54D8875ECA4079B928D268265A20C250BBBCE85C20A216827B0B5FA1F2A90232EC401B468320CA3559E7F08FB537D0085D638833744B2847019B59EB0F119113E327D6913EC33B17C530743050CDD9CFCB20067FC474A44EB8E3A1906F22C46339C10CDBADF9E5128FCC56786531D3C1EB6AC6B3BCB65A45A87A0904821102344F6BE3A53378B03D0A78F777A3886E3B1C20F2F43EFAF2C7BA3E228BC681F209FA4CF9B558461F7C5E1EFBBA721A994FF1AD50113918C7FA48B4B64415AC905D5AC93C7839815FE55A35C89D852FBEBB8716F39080B3A81CBC80A602438A187A59D40DA7F85590B12EDB3E4ADF91324C789FC22AC80EA4C82B1DC1A54210ECD428FB43F64E2197608220CD7151D34809A4ED518D41AC56798E8873BA368F31482D0A31BB1BEBF16E84332D3273E70449FF000D7478F2C44C1747E4578FF056161008412D68B041CEB7B32B7F4A6572CB0251C05A31BB675916A842C64400491F80768C52E751158097B8DD85EDD86D68250F7616E02324A0F61495F7BCE46868E15306560BB1BC4AE5FBB79B5BC5C43264141CE85E419665597B5CA9F188326254BE49E321711A64324A113E3F6A64456C3DC0AE6EC5B7185EF190DAC82D2CE75807DE56FF009D27911C8EAE4384DE9580481A80743E227515835C1A95A771DB50D0EB5301A08C2544C95801640D2660CF8D2EE1959A0B6D3273D46958EB7D96C1AED48B7BEB664082F3CB0B593B93A13FC3E55D8E3B31D8576D7AF6743DC608659E28796202165072EBBF8CD681610A7D0EDC5BF559088C8F13A80B8ECA8C78A5476A84C02AB10BC4B3C0B95836E825046A24A06A494FBB33CAA04C3984961A65B07B6CB3378B3EE15EBBFAF2A8445384DDDC5C15BC5D748476C20EB9C2C6C8275CA9A29CC020C21D43CF30E008E3B410359478660291B87833AAB26DABB7901E0FAD05A000023F54A5183A9A094B2BA2BBC9A7617B0E5C856196723823BA167C8FDAAA3ECA9186563ACF56646424F526D9249081A9CC7FF6D7522BA1128813A90B6D680B9100144F623BC60FFAF0A2F42A68498A61EE3FC536A00004944723A46BAEF4F84C5E0CEAF09BC6A73A234260EF03734F281D2A2A81E1B0FE35084730D88D399FCE88858A68E611AA17B4731B6D50819C0C33FB9BAF90A0ECA3EC57BA59BC7F60D71E27550912A3CA8DB1A8BD0FE4E4691808BDDC582C32891A0AAD4991B3162168410B20900F88A9A896C13A43686DF0F75F2F773B835D4C78269D4C7B17648C9A5F3619DFFD181EB722592650168EF1585983992472F4ADDA98CCDA9FB97EE4DCDAA09641FD4A27B0859ECA35D7734D04B5D4DC5B95ADC1DB80859894202C72DFEDBD5228B70FD5C69616020F607DE47C7C68644182925A42ED9643CEA04900095E9F8878033EB439098FBA397A5AB41D7E1E910D204072103558263B3EA26B2DB0C8DAD965CF06E2DC90722E442375EFAD046381DB04E0C8C8B91ACA06A6B272CD14334AC772B0A97432428E923AE71AD8A0C2D19C85C4AC13A1DEB7F12D622D04C11DB62B7438438D32D121A88CEB9481FE515D172E8405A9FB8B3B3E3363B0F1405BA345E741D027955A97442F6314B401774B01B2164F073CAD0840D0199ED715546F00765CC71956E7F481191CCE5E93082B89E5F7F9529C993B3B07BBB3607F5539D0385E304846E91433984916BBEDC826DD6E781881AF998A40D4009C02FBF483AFE40868BA0A257AC21AC9B09E744E48A193183BC355BC079004FDE94E216423AA0885BA4CE8408154915D02DA746F09B795A2C84C012467D11B6FA5354A40BC19F562D8059DCBB6630B243E4876E0C019D1DA39A7F0CE82B5A5212CCDBBFA390F102E4DE3AF0865A03211AC6BFB71EED35214C5DD225B36EB45B3851D75E95ADE1A21057A00A07F0F763E34E401957D220ACA0F200C4233F3FE54642AE04B3C446C345CF89F0156517B4AB3E0203808746739C09CFA7607CF7A8428EBD79FDF2FE66AFA2CFB85EA562D9C04102398AE2A3A685284D0498D45D974A5290C652EB41446927C69A98B669AC9595007801F6AAC8968BAFDD79166B5B080F5C080D2089124E5FB1DE9D4BEC5D88F9B74AAEF1355CF1CBDD65AF7103508611B084C0DB527F2AE8A46513D92DB4BC5C65EE05D3325E6476D050753948F0DEA0243ACB7284365EBC00E405B1C342F9C899F5D68B05175B59336E1D42D619B910E5BA0F6D0E0EF447AE9412440AB4C580CEB7C2020C9759F72370A48DF7E40D0B88433B66BAC5B3AB432EF1401C2B78E3760FBD9F7DE96C991DD96162E0217DB616B6A5616892B27F09F4D08DC1ACB6BC1A2A41D6364BB530482361133A78D73AE964DD5447CC0F6257E159D2F897214E3787DDDE2D01940220825672449AD5C4909B416C7A2B776E64BCC899D20AF73F0ADAEDE856A3863095A1B0DADE2F20125000032122343A9A8ADE89A95D9747966F9E7AE887ADE66DD98DA79B93E7B556EC9D0D138488423848E137DC0758F4A98993A084D91F103D054D195B22C4D90E6B268E34937269B46BCCFC68FC68AC934B0DFE01534406C765036114788901F10B237ACF00AE1A591C68304A06B03FD6D57940985C7ED1E2F5C61AC2C5CA2D5AE3142CE44432356C1DFB24EBEB4E4982CC8B0E8BC7B3B16CBEC027AC464EE6D0AF8C93CB6A6A42999EBE6AFAEAE386F2CBDA924363B027DE068914558FADCEB6E21C041840006C2040D3D3C289109616DDC5D005E58EA8C083240C817CC0F51545065F5A2117EBB2659CF70E6B6CB0420234CDAF2DB7D6A10A3F4562BFF000F6FF36AAF259F57BBE922EF2D96C16B26711BCD7199D6558B5A4E6A531A8BD49D268080EB991F6A6C4166B58B2B784145C6B034807ED51A10F210AC3D0FB25871685B2E0C8B1A89077147001E4C2FF485878BE43C8B574069821B592421B0BFC08EE8E5EB5D1AB266998461D4583C4A1A3D58CA0ACCC931129F9F3D29AC51CC3E2DC21923B120F14195883AF63D3E957828F18E2BB70B67880F310095E9AC50CD1072B4758702CA386F5E8E334B1D86D64082120FA73A520DC4D1742AC9B7EF995A16E8B76560142CE4733AFB40E9EE48D274341268289BF4B5EFAC0E37BE4733B4D73E66B48071684067CC9ACD71A6845F6CEA3A939E39C52D3FF5925F717E1E96D616B8075A77117C455A1A9481CAB48AC93A303279942498DCEF53059EA6AC8594DC0B3DA9821D4643AA10F1555D108E61E341944333D33C3C756EB566B16D7A4E442C08056B3AAD6A323B224EB4EAA60B3E7968ABC696EAD6EBC1A590C34B70E4418133DAD76DB913BD3DC8530256366C895E1E819D6B9057A8406CF39D399D6AE251563EAB15758E3DD9BAB88F62B042F9E8A53827C6024511042C3EF305A61F5F0D04CEA3B80E99B4D763B511442E5F37178A79986C6C9034D00CB31F53508775267FE2C7C8D5E487D3909D62B8ACEDE42184D29902DF845B216B31209D7CA80804ADC1E5BD3600B1DFFB1F729858B9664EBB941D68E5003C8889C1317684A1E07CD0F50E0252465BA5D87E26FB36E1E42C61F6B20107627754093CB73BD68E3F21B33DB18E448AB1C22CAD90DAD6B78BDDB5AD0616111A424FAFF1AD0A526C5CA31C0B9F484B8CB36CC9410085E782B73CE571F2A7C646634163893D63862ED5187B372D5F92B0B67B0B415FBA95FECF307CE81C887A97DEBA67A98B70BB74105D2F233E75AF40B4E583C8EFE94B95B118A3267D0300BBC09AB369611C078A021732B5C0D63319E7A81CAB1D9C846885121B26E6C5DEE5C0A4E4BD64038B86E5901617B9D2B3F207D0A47AC7FBA64F13359D3F806FD86E16070D6640D79D6DE2FDA26D0DE18F115A753392CA3C68B504AF332565B0B19C6E36AB2CA987C3A170820B66160C760D4C108358832FB61E4101064893E157B1782D4BE56011A83A8355B1304B33B153E44C10567A9F221534C3C82B25D2B04CA0181907808FCEAF5260F722CE9F9D0EA417E35822318B4EACF2E00216083CC795140168C77491845C3D7CCDD32BEAF64C966DD721B6070D19D22553DA5C4F67D2B64053466AD917CFB2E92D70596F205831DBE18EEA499EEE6923EF46009B185055C0659B71679D0161082722CF23AFCE8A251075866E805BC1D086C70C4FFEEF9F2353251EDB3182A2C2ED9B975D372878704A0128C91A93F1D2AB2417E6C3FF00E1D7F3A204FA8213CFC04D717393BAE382E424F04904223DF5F73E9AD568C5BB3050FA6EEE9942DE790E204F0802036808DD209D737ED6D5A668542CC1EFB362C38C8587B990082B3E3947F0A52CB18EE1F31776F700187967985988E7AC695CE96C8720F63A9A139D6C8009813AFD4D526048AF1EC2D189DB2196D61947EB33B624EF11A56AE3D9AB132ECC35F58DBE057600CEF5F3C1C65A64FB46D1C4ECEA343DAD0C72AEA46CD8CF289997F105E2377D59080C2C184100AC211E00993BF3DE9BA99D86F56B868B2C0B8ED8DC1EDAC20FE01B7D6694DA41C51A4C1ED31160879ED50F1EDEBFAB8D088D3F95736E9C65E8E853071F659887491BB07421FB774344C0757D898E699A1AF8DB0D9DCE3E872956808D8D619FB1CD6425090A0167798A1902BA1923F533E5F9D1AFB322DBEC5F73885CDBAC865640898E534744F01F893276D8A62CEE401DEFF3205397265901D10C0C2E9CBEB748517B8A0F8422AE57CF222308816216B66EAC2DF6B8D7AF2010B92082741B4514AC99235A1362CB1652195AF8C47B5878910364AA55FC6B671F66BB156610BED1776FD9DBDB23B0CA06AEFBE04C96E6976CC3A9361CA5BC880DACA20C8C848DAB3AB4D6EA5806BDC6F14B7418B93F7AD55CCCF389658E218BBA50872F97ED0883A7C68E7660578C6AA62E78241BE5F15BDCCC673CBE94BF217817A3ADAD7FEFAE80663B7F7A9E426830E005B25C2F3A0B7B2339D7F14D45265E0CE74854CB459664DCDCB9AA192745F2CBAFFE69B56D21163D4478B2DEC3190828430B0756A73ADA5F78E5DD3CEB6C29664B6F5E840FBAC5EBC1F5985C6801220F88F8EB5A3C4D14AC581859751442DB2B7964FB5666104441223DE9E759AC6321129C4AC6D2D71480D166DCC76273942C7393E53571F414A26ABFD93E8EFF00CC59F98FFB695BC8BD623157B20570481BC7F3AE6419D6B18AB2855C1BF7011656D0FBC16250B83DD4C69ACEA4D6C849182C611D2855C5FB63134066D6C9B675B25BD0E38827B24A041F4F1AD4A09F667733CB64D9E238775CC31D5B7C10510F91DB28EF29B08D79EC77E559AD92AFA1B5F634EB66D6C190CF18159D56355CC768D609F7236C58CF0F7C0B5B43744BE249717EF9D3434AE948360F8938BEAF6FC3596CF04EC4A373E5449AD86461917AB0F64DA3AF824DC360AC2D649324653A9F2A62E46AC55B488ECB006EE31316C88087906E90E0DB6C89472F5AD8EFE8C7E21E747BA3368945B5E2C677403904C81AED582FE534F068AE81F61ABB5B438ADD5D33C7459321C083CF727CAB4F02119FB0395392F4671FBD6F19C3EE71C72D916D62CE786E7392BECA421274EF66FBD6E7C5FD09F3E1767609D2A67117116AE23877247623542E2B99CCE178FB3553CBD8D2252486801249303C75815CF51DBA1F390F5382BDC1C99D00C0F1F19AE947F8C96A629723B10E216C50F3C873428815CFB2B954F06DAA5B22CB2E21659408D24EB40E4F62E58C176337A6C1906EA0E7EE06F9C7AD6B8D32664DE267310C7CDC7B4238300221075211E7A57421C7515D88F2B62EBD6177171EC6D96F3208E2F0CC420F74951D2AE4D25D17AB631B1E2042DB73200DAC21086F61A4C49FBD73ED375482D364EDC0251CB6F09A44586E402AC12F2F6E5164812B71790F8200D4A8D7478EB222F7834769D077ADD042EE104E9060E846D4FB2A32C6D28C4AC5CB45861633C09CE3DF473ACBA86A402968672E01E67E355A8E4325A86AE64D349FDFA3DBA04C574B9A47E93B15C7BE201F55127E95BFF8FED9839CF063F0D4BD88DC86216F0E601D4206933AED5D2B26A1139EAA7291EE2B602C14BC80A1234009CE7D7955D7629409645A9607DD114BAC0B62B10165D47A884AAB977BC1D4AE231C4B046F18C4F1039CA0869958023F5910927E23952FCB841CA2667A9635FF002B3F234DF247F627466B7162BCE596572B5A20B2049FDED74D891B573E8C64DFCA6C43882423A3C82DEA80787704385673F34E4FD9D2B76BF230B9B1B59596176F636D7975706E9D782185DBB2439AAC7720ABE3E4697B4B3FD149202458DC6198BB4DB2CFF51419432FC02B717CD2113E54E9284D7F65A6D1A842C34CF07F53701E5A2E2DC4947607654851AE7DDC748DD44FB2E615EC6D3D1DAC53354990C415A23C9915758C4BAC8B2EB18BBB528B5B4B6174EBC3B6164C21076303F3AD55F1F3DB11758F384116DC646336D757280C85DABCCA23B84B3DB98FDDA2D331D4CB296243EC098FFE996CDA256B43282B81B6713AD63BB8F294B61AAC4903DFDDB365678CF1D05C43D6B08C8246815B9F8D6AE0CB0279316D18EB9C508E85DBE18CB44BBC62FDC10344373D99F8C576633463D25812F4556F8C7ACE112B2F0006FA73359F98FF00D6DB0E8F67D6D8BA16174870A33900C098D49DEB87C6B35964E94EBDA23C6F1959B4375C1D01DA752399AEA479BD64C2E8EC458B5FA6F89752D96D710BD77F0AE772EE563C9BA9AF444AC2116E8797A2100AD67C86B596B8B94C2BBA106317B7DD20BEB7387A21A5C8B65BDA2168477949024AB5DE2BBF0AF5473640EAC270EC39E06E6E518ADCAD6006672210B3BE71AF66956365A487F69666C707790B20ADC773AF20C881262123E15CFB2CD8DB5C56456B4B36A8009C889DC9E67CCD543331ED611EE1F8B3631044BCC9B7D8141ED8FDE41D2B4461F130CDF668706C5706C396F3CFDCA03CE2E0738401E535B389AAEC0BB2C6E31BC39DB7EB28B8059060AF589F0A7D92FC898C4031BBDB2BAB3CECBE92F37AB7E7E29ACB67686463D88D32878046A85811A7CC52356FA34B692323897F48184B37C4943AE2ECDE2C221719D1B2D597BBF3ADEB8FF132CAFECA7A557AE3B7D68E0928010E207EC10A2299C386AC4731EC8CE7455F6DAC440598E2023E3BFE55AB92B68604F1BA9648F4B6F33BC19267759F8EC3E555C786B0C156F7664D2E16B08C3AC9EE4878159F00B19155CEB1766F87A1DDB3E58C6AEDBC80F12DD9D3C60A8507E0645AC866BE3F534B19803C59D08B70FB1107FF00C93A2052698FFB06CB12467EDACB0B0B25C783D266100AC67FFCD6EC99345917DEAAC18BCBB0C82843626DC947894EA42BE34FFB9742D47B34587DA1BC66DF8EF2D649CE24ED9CE9F435CFB25ABE8D2AA1D5F60C6D5682C95E80F981158FCCE5934420932DB6C3DEB8B3B7234804411E3BD2652EC667B01C7DCEA692822579036044C9F38FAD69E276F0479C60436C85BF8F3574B7437A06F491A6D1CEBA928E16017C697B0EC42F5C7CB56A16D0EABC547180273970645C9A1847502CE366BD8218E956376A49605B8051C3E284139F2728CDE7BD48CE38C7ECC5A32AC5AFB17BDC15D402D36EAC86DD0810726E4A55F2A9055A2ACDF067F1B61CB0C31011724BAB205C6B39C2C6D4E86053DB019FD1DA1616F2D8FF007894041C99C8F18F855722398E1974FB368FBE5F0D2CB450BC8251E7CEB836D7AF48EB425D137EF8585B17DF0BE1688C8015AF3AFF0008FAD153539AC09B64A0089C7F095DB122E5026601941D396B4EFF00193C83F59128C4B1B17985F506DA5B7302EE0A0AF8332B0215E15AA8E1B8333CEFC9E748F16B8C47AA3D86D95D5AA2D90B6C1282070D623B251E42B5EB24C46C6791C661C417A4E420846430420CC28EF552AF259ACBDC4AFEE99B65B6D3ACDBBCD12F202261C41DA549F0DAB14B8983442CEC538DDA5DDE59964025D941403083A1E59A28F8D43CB0EDB4D7751B67C4F574383C7203F6ACF3AE797FA2A0D320AC26C235B46BE28155173414A2982DB2EC5AC15362865936A53C6CA49592BEF66CD5A1F33AD405499DBD7DB0D2D6BB76890242017849FF003D3633C83A92E9BE1B6F84E0C6F2CD6B66E02D110E98D771ACD4A9A7206793C6FA1D84DD32CB8E344AD680B26775AC4A89A44B972095489DEF46ED10D978ADD3C0123504808D809ABAB9320A75458B2F98B16AD1E799CE2F5964BC8CED2257937950F5AD30B64D88F0E11E609D1B18B61B6F883EBC970E4923203190C0DE6AE7C970780614E7B0973A38BB3C3AE10DBDEC402BC91A923B5BD215F963BC7D1C86AE558D05B2EA02DEB00B0B82444F81579D1CA7D14A2F230FD178DFFC633FFA27FEEA579A2330C0BA508E0746ECAD724A1E64B99E75941DA2B47D3A566408CFA176177A5762C9CFB08F9695271C4828B16E24A1D6DD59412B71004FD3F2A757E801C60D8CAF25BC5B1311A9D8C08AC9753934419F444E10F3E842F3B5A8905131AF8561FA52BCA5EC611708011C6FA4FDE8FE909E617F48BA36876C6E1F7082B647110763D8E53F4A751C76982EFF0047CF9F68F5B28448330011AEFA695BFD1D8534EAC8CEEF00C4D7174DB39010259321608DC00BF9D0B30C2E582EC351628B3758C4DE386DE8CE65C47F62E6C60C73A5788CD26B233E918B16BA3C1CB5B945D0B97901A537A46446433FE5A7E119766621563D69A79C589B72E8641E65E8CC22AF24C9B1E83DA58E0568486F8D74579CAE62320809FA9A4CAEEC38D687184E205D6D6B0481261133009DAB83CB94B736C63D05BB78E06D7075E5EB49A6C93976CA92583E3F99D376F38F6E85991FB64EDF3AF65C659AD1C0E4E54C2ADBDA9D4492753EB5BE152391772A79351D1945FE22EF55B2D10442DE9D1B6C68A57F88E83E3597936454B06EE1D5628E7F66D2E7A38B4211D55E240EF85AC8D62330FE14B85B5B46D9D73FC17E056970F7583752DEB08009D40D979B51F2A5EA9B1B1DD2EC47D2DBEBAC1DEE0DAE3C817247111657CD05823943813D9F8D16544259623B4E957486FAF2D908799B90F3B91D6986D085C44A95995E437A4F92380D459B75609685B716879EB375E4C1F681793CC24E64FCA979AD84948429E8706ACC59D9DC1193543CE4C1D64A4A07D2B1FC1C87A93C0B1CE8762E8B96B8E03F6E4CAD6C9248C9DA0085478535B8E3A60A6F20FD38E35E616B6721CEB791D85833BF85278EDEC1DB2E8927A4D6CC3286FAB119004139C4F604776A4F8F960AB01F10E9233716E596DA203C352BD204EA32893450E3B45BB05EA587EC718BA3A348B4430D4E9AACE63A1F414F8AC3064C71D1320E0166408904C7C6B37217CC3AD873E9CD6EE8DC941D3E14A5ED06C4B64AC97F8399FD758ADB8FDC322B4CBB4C531BFF00B4984FF782B378641E512E91D95B626F15990B2D0402341B6923E35B54DB62D43A30387F1AC99E0383B609008EE7CE9F2597903382CB961C5996DD01E31209190C191AE6A6A8F40B9165A3EF5AA036E3B6B9C6810B5AC8FF00A692E1D851B0D031D3EC798650CA2E2C82100047B23B0FF150B4419613FD25BDC60CE261010F1086AED83D80B3B0712AD53EB40D13033C7F1F6576FC1E308CE8CF04194032A11AD05563C86E1D185C131016776D5FA00219592513256B9EF4EA398AD2C3573D3536D83F4C518CE22D5ADCB5C15904B2B9CE0AD1AC287A5411DA09E97E0031BB4E33601BEB39289139D075537F1E55325F6636E706E9231871B53853C2DD1701F672201C816141C1089F2D28B42B2077B7AD5BE008C3D6783762EB88F32B90B1FB447A52B564C86318DBC30BB72C20DD5C9043A511D833A05CC504E1F218A4D0761B8FAD16C8030EB8F35883279E82B0DDC28CE412E4B458BE9716BF5968B47805F63EF56BF884FB4C097F21AFB466F10605F5C179868B21C39D688CE339EF2A47F0AEE716A9551391C8B636C8F30DC22F1772867384059D5E2720403B9ED4569B2E6A0D9863C6529A47D730FB6B3C26C022D91EC900091BAC8100935E7D592B24DB3D142B49240E9E91A03C10F34321300EF07CE69B1BB013A97E09ABA5E82AE1DB238CAE411A8A3FAA922DD08C2748AECDFF0048AEDE7842D003393702395149B6828411E7466E40E9096C2092CDA2D616364673127ED59F909AAB25C71B1B4EB80BE048D6048D85723160FCAC11BC7CCE70644EE0E94ADE79096305772B28711A91E86A46C960BD501F499B3796F696B243AF5D200780CE5000513A7C2BA7FC74FF00FA32DC66578262DFA4EF78843C6D50C8049C8021633699BEB5D0D50B4CA6EF0FC458E17119D1E5865A21608CEBD81344A246C79D10C02DEFEC6EF8E40B845D2D85B648FECC41FAD4B218457906E9E862100705D207208DBE1599D79612B082BA2B793A5C1F8D4F1FA09CCC262C8BBB2C1AD3129192D6EEE1823C3BDA4D6885629CCCA75B7BF03DF235A3442F667D1938C5E3E73A2D8672404672758F9564F469C99F75AC8F2C6C41223E34DC83839281E03FD78557642DE136441008F08FBD4C930536D72DE177C863860DBBF31A0250BDF426A38E51132EC4B1B4704A10021A885C01CF41245028765B669DAC36D880D9403B0FF5158F6C4C7B5D196E8DE00D5C58971E5BA105E70348440EC20C4999E75AEEBF0263119BB83358732BBFB05BC2F99136E567380B3A6DF1A5D7C8CB2E5583DA749317B3640BF5DD2D727DA91C646F20489A73F9307D10C53FA47C4D0D05D95F1EB12338C91D8F1834D83604CCCBF8DDF22ED77F6AB06EAE979EE2405C9DCC854F3AD0B028D3747BA6F76B65D17ABB760CE808034F29ACD74723E0C6B6DD2AC2C93C6BCB5646F237F4481348F1319B20B7FA678086C866E1EB927DC66DCC79C97328AA8D128FE453926666EEDAEEE965CC3ED0B2811BAC15AF3EA0C0815D4E3DDAFB399C9E2397A2855CE2D66723C85A0C480E0891E3AD69F356605C4BB238C27A478B80BB60B65B43834756B0BC9E2437E95CEE4B87E0EBF1616C7D9CEDB5CBBA9C42E0F99C8507E158BBFD1BC218C5B1AB040422EED32722F3411F3CAA157AFF004414A16F3AE5C3EF1056F12B944804F3201D77DA993ECAC8D3A07C37F1FBD20CCB3C323C0028D7F2A96AF8009F66B1F502F200D067303CB61F6AE6B793403B764DBAF3A841220983E3EA2A3A932F63B22EE1E69B5AF2100C91BC728FE349AEBC16E4577F68117CCBE813C1D42C9D640CBACFAD6D8CB029C720EC3B7C8BCBDBA4323DB96E35D21023979D37C80E843107F14BD67806DF8602D0E07842F22DB3992634ABF29342DB153AC62776B0C8E0DE10F6723B8E4655A63E00FCEAE566503A0C96BE28201C8B3B16FB07E14A56609A0AAF71DC5EC179116E5680345978A17FE55451C27FD97AB30DD247F1C592CB76857872EE3AE38D77FDA2C42818AD90B163D889C19A0FF6F07FC99DFF00F9C52B45FB2C69949840EC006420EA8F81A47E47B33187D91C6713C516E3BC1B765E21B5A003249D649AD0DE100CF30FC34DD5FE20CF5B22DECC8421DE10256B3B88ABB24520F5600E7B97323CDAFE0BA4AB06A42CBDC1E71AB1B57AE250B415E76C4111CA153E14F53F800D7613D2261BB7C02E5962DF868EC127524C2FDE348AE5990535D1A16185AC4911A6C2662B3FFD83DBA17E096376C58DBB65A585A010510651ACD32D5964830C750F6A161641DC418A18A4997B095DB6BB05008EC4921D00EBDE50CC0F95698C844CAED30BB85CBC485F1996811AE800D3EF433B10718067E8B4250101988DC803F3A5F90B70173BD1B4124B6820F3D29CAFC8B5583BF835E356EF1065006DFF0088A256A238339787DF3416E2EDF3A20930478473D6AF74C8E381FAB16B7B5B4590CAD0502432B04675F213AD0968058B213C7B9F6D76BD56EAF58FD94CFD29129B0D4504292D9DD00FC2A97613E8AF816FFDD8F951EF22888619064013E31532CA2A52A5E8F1207AF2A22B068FA19813B810B97EFF00479E12359E72A4E5FE7556D9F1012EC2DABD0EDF328079ED5CE5166C6D16A710B4B5B92879D436B2B200240FBD3231629C8212A0A7ADCF38744FC74FBD1E0B217C41780226473A5C89907530CFB84A0F969559088A5246864F9C9A99216E9BFDF7A667A048A2E62E020F9C03BD2A7E8842E6EC9046F4A88C58173FC33BA04F8D3E2C19240B919FC028F690381C637895A61B84BD8932438008651EF9797A2131EB5B69F9086DA17F46F0B7309C250C1FF79592F5DCEA82E2F947ECED576B2B1903B3719C1195DAB6BE33CB595BC48D16B59E6AF2A161264958B5F48059089F8D2DC02C8BAF9D7474870E79C91EC9CDB7A6C7A814FD8ED4866F6D176AF85965E10E6B122674F952233C0C711922E5C8EF98F85015827D757AC131CFFF00350855FA58EDBFAD0648A2097D883CEB24040D257B41D111F9D3612065120D628F219659004E4004F20044D5C89139576489E14CEF1E3428267A80543F54502AF0516AAC995A0B6B060E953043AFAD91FA32E7268BE11027E5571F60B443A5880C603705B9105AD79133B5154B332DFA00461F8B2D0873AA0C8B0088786B9C48D0C546922D14A5370B7976DD5D66E1900AD020E40BEEED57AE0840A2E13DF65E1FE03F94D44D1681DDBD431FAE059F35A0A07D68976C1914D93A177D640821174F016EE904217067B2AFE14E947A1793777AAE392163383B8DAB9DBE0D1AFC401183589738C190DAC6CF364858F4357E664F194ABA2F87495A33C9DCAFB64F99268BCCC9E32E630B2D70725C11D5A782468616648236E553C85052D0F139CAF3F9FF002A0F643D4A7277E0559672DFCBBC09DB4959F8506087215FE01EBDBF9D160858A4CB79C00867FBD5EDF0AB9C482A7DD20EB49D434C11D5D3610C032653C7453300E4A1AC0B1CE234BC41A66EB82BE234F20F7163DE527B23D3C29EB975FA819635CE3F70E2CAE6C31308E26970767412B42FD77FBD53963B63577E821584B683ED190276720643F63F3A264D49A3076502194204EE8D48FA52DCC3C03BBD1EB15DDB373DCB86242013D8EDEE4EFF005A076745EA16A63277D113A8E60D29860EEA97C8401CC6DF0A22104A4CC49FE556408E037C813354E244CAAE70F26DDD2812BC8606D26341512024C83187AC360B88ED9027F634EED1499224D36827C28130D924B01277DBC28B628B5282A8898AAD887AB696FB2B6CC8411122877EC92403D377CFE85C9C8BA8115A38CFE42E5E862B51010CB2248001276400229336F2322BA175A58BD6F7F7778B209B9081935EC06C4003E745293C151F6139572748F083494D842FE9426E5DC0EF5064A227533DC39A9D47DC0484D762E6EBA2D87DE33DFC3487991E4830BAD59F9B42F53516977D71945C8EDDBBC02C7983E95CF9FB6684FE212A5F308FAD0167897E36FA5110E5281D4CFA73AAC02729D237244F23AACFA0A22114A4AF50387E660AFE7B51A2892131A3625677E67E268B0405BDC42D2CBB0BF6EF44F0472F3A2480C99E7F1BC4AF6F02176971D50C82E0EC64F34057E7AD3A51582127F1DC230D8B47AEE1D469DB95AFFC46931A252ECB933D5DF32B44A16083B79D33C4C1C8275B145A1591C60ED6278DE124E26EC21FD90C421793F6C8FC5E158F91AD33CD689529591C4D9163A20CD84F56BB7434755B2E0051FF00C7E757FE4B7EA5122E1E9DA64704E97B3C536CCBBD650824042F49403DE40AD7E19259171BF2692D9DB6BE467B331B4A17DCF84FE4296D7EC6FF00E1EE63391620F81FCA74F90A8E259C94B80420F60F23B1F8AA3E8292E2110521139E782EEE42FB9F0FE75582135272885B40123481BF9D06C4248616BD663C08D45373FA21722D0C6A6639D4FF00D2125B040902819001D8DBEC3F8D44116B48B7890249E750B3C528CF80A84395244C9D395522C51D2EB6BCBCB4659651243CDACC902108DCEB4DA1E05490426F434324C93AAD7E27E14219E67CE4810644EF50B3B844910341B99DE6A990A9D50C8B61C2421C0504792F4A38740B33FD0C74BB6EE61EF1EC5AAD608F10BE5F3AD1C9FD8A8234D69D5AD5B430C0E1B48EE2068056293FC8F084BAC81E5E1CEA88494A29133C36BF19FCBF951108A5455FA91007F6A7BF23C009FAD5A451C9E0B4247C5675FA8CD444395A0CEF1E1A3949ED9A91E8AE84D8A74A1968A2D5B77AA878C217B2F3CC7687E1A678A5EC4F950BEE7A3B7CF5CA1F5E20592C9CE84323B085F8F6AABEA963180D52DF6CA7A4D8FE2F8394706D10F34F4210F6BDFF00C2523E947C7AA33F6C29D8E3D205E03D78B66EF1165B5DE0EC32CB6369E527F3DA9CA4A0B0BD0B4BB0B535C2586D080F624E0313DC6C73FF00CF3A1DBF212F609FA0AFBFE2D9FF00D33FF755F9D7E8BF130DC4B0417ECF5AC3096DDE60128923911F8A950B3597FB101755BC7E0CBBA1987DFDC3370BC49D75CB712CF5659264FBC543E94BE7CE3EEB42F8B092EA4C66EF4330259045B7056365B64A23E558573AD4BB35FD343F02FC5B16B7C0313B7B6E32D6E94672EAC93C393099CB1F3AE971E0EF8E4CB6DAAA1F58E3ECDD210DDD2F393DC79B072792B3554F3109318709691225E6BC51A9FF00E22A41A61924E4588D20EB93BE7FCA881F3A168B23956C7BF08E687A24FEE246B40EB2C9238739C4DB2CC421677FF5E741AE3D102157210786B4411F2ABDBF64297DF2B12820A3CB5AA64075428478D4411EA76814259DC51CC7FA15080EFBE5311CC8FBD444641D4F17593A729A24F05A40096209E624D5947A950490420F8133E35084D4E88C990EBBEB522405F62AD9042C69275A20493185DA5BBCBBA60C5CBE3DB1F1A93B365824505A12E2C4ACC01A9276F81FE14BC04C925DCD1D5912362F11D841F4D6AC87A84E639D7ED97104F7D1F008829A348A2DE2ADF238633AFF001F7D03D55A2BE1478048BF7D6F6A4EA1FBD00AD009D8738FF5342564CC3F8DDA6278B22C16F672F0D340436B46A0034F95728C722FC8A5D12574330B5ACAEE78B72E9DCAD7FF006C52BEAA78E86AE2AF601D337F1AB00CAF0D7962DCC325B1AAC2FDDD77A7712107EC5DFBAE91561B6B76CB21EBE71DB9BD70E8D139E17C9291F9D1D8D67E2895C64BD8C2F2F19C12D17757266E08891CA766D1F9CD0463BB2E5233FD15E90BAFE34E97F5E3234F04046B15A2FA7101754FE46BF8EDF88AC3AB36F43ABFC3CBC4DFD909B889BB664210E78147FF00B3C3C79D5359EA7EC42F8FDBE8438861ACE2CCF59B6596DEDB38250647BAB035AAAED75BC4BD17656AC5F1F6236AE7A4F6B88B3878B9783AE10812646BFBD3CAB7CE1C7957B25D9CD8ABA33ED9B6C43A27845FACAEE99CEF680BD242D70224C570A1FC8D9536A2F08E83E346D5DA07B6E875A59C8B2B879941FEC5673A27C7F98A77F939B786BD94B89AF60B84F484B170F316D0B0C121D43CB3B2342B133DEF2ADBF4F638E500AE8BE99A5B6BBB6C481085E4B880560103ED40B3F90D2C16AA6DE6619478B233AD7FE2555E105922EA4247B40199F7DE39DCF82450B444C82517202F820BCC91A97FB1FE4E754996D15252CBAE45AAC8763F54BD89E6336DF3A1D0B20A74B448791934DC0D3D637A843B398CE1728DC11B50AF61114A4E4D47991525EC841504A349D6A884FE95080EA8256483F96D56C1478AB6904201F5A888CB156567CC92BF006AB76594F526492B1A343BEB274F0EF7F0A2EC120A521A30D8E32E3531EC507CFF0089ABC164D36CE2C67B925E23B8B660A07AA6A648494FA1046C49D070E5B73FC9B55B40E49A9A9417AF179191C8405FF89423E9513C17817E33D24164CBAD826D5081EC9D8DFCA0532AADCCA9C9405FD41BC6ED197D770B085A35C90167C89D6A3B7C4FD13C7E54796DD11C16D5C43CDB44BA82085959D08E7A504F9363EB3D05F4F5C3D197C6F10E928C657863772B327D88442250BD44915BE9857A65A334A566DD319D8E17FA38072E9E5DD5EAFB089257DB3EEA01FBD04AEFE86258183AB6F096CDE5D902E003E686BF6511F53CFD2852F21252D4C0E3B8DBB8B5C673A343B88FCCD6DAEBD118EC9EC6A3A1982328C24E2246779C9467FC03C2B3726C79C1A78D009E01FF005141B1AB0687A024A92964EAD07F2849FC3E1E94BE52F964CF07D16E24A28E91341309172D153F000CE46C4F98A4E36F61D3D3E8AB16F62D0BA6FB370D13C3779A74E541C7FB59773F90CBA2D7D737A3FAC2F3E9E007D80AC17C12C932C6AADCFA1FB564A5E6C41DAFE07C69B5292E070121CCE7B437F9D7B5ABFE3470F1F337362E15B6C2D5056A04A94522498DC98AE6F24EBD66B2C9E71DB61C439BB037F4ACD59733DB665B43CFA923B4908CA7723D26992244A6D7FADBABEB1ED3C8EDF2A141B238D001B640DA2A108D9FB4B2285F68248CB3A91E877A12003BD9DB4CD19A39EBCE857B0861C8FAD497B202AF76BF7FF2AA213FC5EA2A1477F6CBFF00055B29120EAC3660F854446413FAD5A7DD49D072DF9F8FC6968B2AB825EB9E139DA6F3C65E514D4C1395FD56E386C761B9EE8DBE544593C41A434E1536322BC53A1FA5090AB0BEDDBADF5769D23559D49A39802DE9212627F101F09AA8047CFB1D7DD76FB2B8A2A4A7BA0EC3D2BB14AC1CCB7D9B2E847FF60B7FDF73EF5CAE6FDC7478BF68463972F5B01C1565D0F21F9D2608609F0379CBC5AEE6E0F11F8CBC43BE5F0F4AE8CBEC12BEE18619DAC52F275C880113C81DC0F09A584CC974D2E1EEB686339E14CE4E5335A38E85DA670F3AD5F83148FA0745FD9E1CDA51A254C82A1C89956A6B9DC9F66FE30DB848F0A51A0FFFD900
Posted by: Ally at January 16, 2004 10:04 AM
I have successfully displayed an image but only get the image. All html text is missing including things like bgcolor in body tag. How do you accomplish both?
Posted by: mike at May 17, 2004 12:06 PM
Jeez this ain't easy. Anyway I have tried multiple solution examples to no avail. I have on question. In paul's solution October 15:
what is the document_name?
If its the column i'm getting errors, if not I have no idea, i'm on my 16th hour with this thing.
I can save it as a file and view it, but if im going to do that why store it in a database?
Any way thanks, feel free to email me.
Posted by: joe at July 21, 2004 3:02 PM
I have used the code block on the top to retrieve images from a Oracle database.
Kode:
context = getPageContext();
context.setFlushOutput(false);
response = context.getResponse().getResponse();
out = response.getOutputStream();
response.setContentType("image/jpeg");
response.setContentLength(arrayLen(pic));
out.write(pic);
out.flush();
out.close();
This works well. But can I use the same code (in some way) to retrieve video clips as well?? (Have tried, but haven't found a solution that works yet) The videos are stored using the datatype ordsys.ordimage.
I hope someone can help me with this one.
Regards,
Gjermund
Posted by: Gjermund at August 2, 2004 4:57 AM
I have a question for ya'll..
i am using cfhttp to retrieve a pushed out image... but am having problems displaying the jpeg on my page.. using spikes example above.. i get a broken image.. if i change the type to /jpeg it throws an error.. any suggestions?
Posted by: Critter at November 19, 2004 10:47 AM
I was /finally/ able to get it to spit out the jpeg by using Christians original example...
danke
Posted by: Critter at November 19, 2004 1:04 PM
hi guys,
I use all these methods but nothing else..I have an image data in database(BLOB) and I also upload files like rar,zip,csv,xls,pdf ....No problem with data in database but I can't force it to downloaded with coldfusion....With asp data can be downloaded(Response.BinaryWrite) but there is a problem with naming(downloading with pagename)-type and user have to change file name....I think there is a stream problem with coldfusion streaming...That make me crazy....Is there a method like BinaryWrite...Please help..Thanks
Posted by: volkan at April 29, 2005 4:08 AM
hi guys,
I use all these methods but nothing else..I have an image data in database(BLOB) and I also upload files like rar,zip,csv,xls,pdf ....No problem with data in database but I can't force it to downloaded with coldfusion....With asp data can be downloaded(Response.BinaryWrite) but there is a problem with naming(downloading with pagename)-type and user have to change file name....I think there is a stream problem with coldfusion streaming...That make me crazy....Is there a method like BinaryWrite...Please help..Thanks
Posted by: volkan at April 29, 2005 4:10 AM
Hi How do i know the right character encoding to use i.e. charset=8859_1.
I have been trying to download get my application to download a pdf file but it keeps saying the file is damaged and cant be repaired. It seems to upload ok(at least i dont get any errors) but downloading the files has been a problem. Can anybody help. thanks Ese
Posted by: Ese at May 10, 2005 5:01 PM
Reference of(Posted by: Kyle at October 7, 2003 01:09 AM).When i reached
#tostring(tobinary(upl.doc_base64))#
An error encoutered
Parameter 1 of function toBinary which is now "504568555455772B44516F4E436A7843543052" must be a base64-encoded string
I dun understand since I had converted it into Base64 before I insert into mydatabase
INSERT INTO myblobs (
blobid,
blobTitle,
blobData,
blobType)
VALUES (
'0',
'#file.serverfile#',
,
'#MimeType#'
)
Important helps will really helps all peoples..
I beleive outthere a lot of peoples suffering the same problems...
Thanks
Posted by: Ivan at November 8, 2005 8:00 PM
>
>
cfquery name="upl"
datasource="testmysql"
dbtype="odbc"
>
INSERT INTO myblobs (
blobid,
blobTitle,
blobData,
blobType)
VALUES (
'0',
'#file.serverfile#',
>
CFQUERYPARAM
CFSQLTYPE="CF_SQL_LONGVARCHAR" VALUE="#base64#"
>,
'#MimeType#'
)
Posted by: Ivan at November 8, 2005 8:18 PM
Anybody please reply to solve my issue.
THANKS
Posted by: Ivan at November 8, 2005 11:47 PM
I tried the above method, but on some graphic, the image got cut off half way, the size is correct except the half of the image is cut off... any ideas?
Posted by: tom a at December 20, 2005 3:59 PM