Re: [cgi-devel] force download of a file (jpg...)
Status: Beta
Brought to you by:
drrngrvy
|
From: <jc...@ol...> - 2011-01-12 01:31:50
|
Hello Darren
Thank you for your answer; it works perfectly!
Jean-Christophe
> Hi,
>
> On 10 January 2011 16:34, <jc...@ol...> wrote:
>
>> Hello,
>>
>> The have the user download an image (versus having the browser display
>> the
>> image), one usually writes a script like this:
>>
>> header("Pragma: public");
>> header("Expires: 0");
>> header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
>> header("Content-Type: application/force-download");
>> header("Content-Disposition: attachment; filename=".basename($file));
>> header("Content-Description: File Transfer");
>> readfile($file);
>>
>> How would that work with the cgi library? I am not sure how to write the
>> equivalent of the header functions.
>>
>
> There is a general way to stream headers:
>
> ---
> cgi::response resp;
> resp<< cgi::header("Pragma", "public");
> ---
>
> There are also some specific helpers, although only a few come "built-in":
>
> ---
> cgi::response resp;
> resp
> << cgi::content_type("application/force-download")
> << cgi::content_disposition("attachment; filename=".basename($file)");
> ---
>
> After setting headers, one simple option would be to stream the file into
> the response (which would involve copying the contents) and then send that
> back to the user.
>
> An more efficient approach is to read and write the file in chunks, using
> the Boost.Asio write() functions on request.client(). There is an example
> of
> doing this in svn trunk, which you can find here:
>
> https://svn.boost.org/svn/boost/sandbox/SOC/2007/cgi/trunk/libs/cgi/example/fcgi/file_browser/main.cpp
>
> HTH,
> Darren
>
|