On Thu, 10 Jun 2010, ABorka wrote:
On 6/10/2010 13:30, Leonardo M. Ramé wrote:
El jue, 10-06-2010 a las 17:23 -0300, Leonardo M. Ramé escribió:
Hi, I'm trying to implement file downloading for an fpWeb CGI without
success, I'm doing this so far:
procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
var
lImage: string;
lFileStream: TFileStream;
begin
lImage := '/home/leonardo/files/file1.dcm';
lFileStream := TFileStream.Create(lImage, fmShareDenyNone);
try
AResponse.ContentType := 'image/dicom3';
AResponse.CustomHeaders.Values['Content-Disposition'] :=
'attachment; filename=' + ExtractFileName(lImage);
AResponse.LoadFromStream(lFileStream, True);
AResponse.SendContent; // not sure if this is needed.
finally
lFileStream.Free;
end;
Handled := True;
end;
And the results of curl are this:
* About to connect() to localhost port 80 (#0)
* Trying ::1... connected
* Connected to localhost (::1) port 80 (#0)
GET /cgi-bin/getstudy/StudyId?IdSeries=1 HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7
OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: localhost
Accept: */*
< HTTP/1.1 200 OK
< Date: Thu, 10 Jun 2010 20:17:52 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Content-Disposition: attachment; filename=MR_4c1139a4b76d62c2.dcm
< Content-Length: 0
< Content-Type: image/dicom3
<
* Connection #0 to host localhost left intact
* Closing connection #0
As you can see, the Content-Lenght is 0, and the image isn't downloaded.
What is the correct way of implementing this?.
Sorry, I found the solution (I just needed to create an instance of
AResponse.ContentStream):
AResponse.ContentStream := TFileStream.Create(lImage, fmShareDenyNone);
try
AResponse.ContentType := 'image/dicom3';
AResponse.CustomHeaders.Values['Content-Disposition'] := 'attachment;
filename=' + ExtractFileName(lImage);
AResponse.ContentLength := AResponse.ContentStream.Size;
AResponse.SendContent;
finally
AResponse.ContentStream.Free;
end;
The filename might need to be between double quotes, like
AResponse.CustomHeaders.Add('Content-Disposition= attachment; filename="blah
blah.csv"');
because there might be some spaces in the name for example.
Also, I am not sure but does the AResponse.ContentStream need to be freed
after the SendContent or SendResponse? If I remember right, back it old
delphi days with the proper way, the stream was not freed. Not sure how it
works in FPC/Lazarus though.
If you use ContentStream, you must free it manually.
Michael.
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus