[Seaside] How to set the mime-type of a response?

Julian Fitzell julian at beta4.com
Thu Oct 16 11:26:44 CEST 2003


Ian Prince wrote:
> Hi Julian and Brian,
> 
>     thank you both for your quick responses.
> 
> I have implemented Julian's suggestion - works like a charm.
> 
> OTOH, I did manage to freeze my image when calling 
> anchorWithDocument:mimeType:text: v as follows
> 
>     html
>         list: batcher batch
>         do: [:ea | html
>                 anchorWithDocument: (self contents: ea)
>                 mimeType: 'application/pdf'
>                 text: ea].
> 
> where the batcher is on a file directory with some very large pdf files.
> 
> It seems like all the Documents in the batched list are "created" in 
> memory.

Yeah, they would all be pulled in when you call #contents: I presume.

> How can I avoid this issue, i.e delay creating the documents until the 
> user actually clicks on a document link?
>
> I get the feeling the answer is simple - I just can't quite see it at 
> this stage in my Seaside newbie-ness.

Ok, I guess you have two choices.  WADocumentHandler (which is the thing 
being added to handle the request from the user for that URL) expects a 
MIMEDocument which expects a String for its content.  So you can't use 
that if you want to delay the reading of the file.

First, assuming your PDF files are static, you could add another 
subclass of WARequestHandler that would hold, say a filename and a mime 
type and read the file in when the request came in.  You'd want to write 
#hash and #= methods that use the filename and the mime type so that the 
  browser can cache the requests.  You might also want to look at using 
an MD5 hash of the file or something so it will detect if the file 
contents change (depending on whether this is an issue for you).  Then 
look at WAHtmlRenderer#urlForDocument:mimeType: and use similar code but 
pass in one of your request handlers instead of a WADocumentHandler.

Second option which doesn't make use of the cache and therefore is 
probably simpler if you're dynamically generating the files, would be to 
simply do something like:

renderContentOn: html
	html
		list: batcher batch
		do: [:ea | html anchorWithAction: [self showPDF: ea] text: ea]

showPDF: fileName
self session returnResponse:
	(WAGenericResponse new
		contentType: 'application/pdf'
		nextPutAll: (self contentFor: fileName);
		yourself)


Oh, actually you have three options.  You could also serve the files 
from comanche or apache or something and just use static URLs to the files.

Hope that gives you some direction.  Shout if you need clarification.

Julian



More information about the Seaside mailing list