473,287 Members | 1,582 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,287 software developers and data experts.

How do I send HTML and a file for 'Save-As' at the same time?

Hello,

If you point your browser to this page,

http://prdownloads.sourceforge.net/v...use_mirror=umn

the server sends you the HTML page, and very soon afterwards, you are
prompted to do a 'Save-As' for a file to download.

How do they do that without the classic "Headers already sent" error?

In my application, I need to do something very similar.

Thanks in advance for any help!

Eric

Jul 17 '05 #1
14 2631
If you look at the html code of the page you're talking about, you'll notice
the following:

<META HTTP-EQUIV="refresh" content="5;
URL=http://umn.dl.sourceforge.net/sourceforge/vnc-tight/tightvnc-1.2.9_x86_viewer.zip">

This line makes the file to download 5 seconds after the page is loaded.
This is often used for redirection, but since in this case it refresh (or
redirect) to a zip file, then this doesn't replace the page but prompt to
save the file instead.

Dae
<ed******@virtualcad.com> wrote in message
news:11**********************@o13g2000cwo.googlegr oups.com...
Hello,

If you point your browser to this page,

http://prdownloads.sourceforge.net/v...use_mirror=umn

the server sends you the HTML page, and very soon afterwards, you are
prompted to do a 'Save-As' for a file to download.

How do they do that without the classic "Headers already sent" error?

In my application, I need to do something very similar.

Thanks in advance for any help!

Eric

Jul 17 '05 #2
Hello,

OK .. that makes sense. I didn't realize it was just waiting 5 seconds
to serve me a file that already exists. I thought it was processing a
file and serving it to me as soon as it was ready, which is what I need
to do.

The file I am going to serve the User can take anywhere from 3 to 30
seconds to create dynamically. If I use a value too low, the page will
refresh to 'Object not found'. If the value is too high, the User is
waiting longer than they should have to.

Here is what I want my application to do:

1. User clicks on a link.
2. Server sends HTML page explaining it may take up to 30 seconds.
3. Server sends file prompting a 'Save-As' as soon as it is ready.

I would like it better if there was no User interaction other than step
1.

Is this possible?

Eric

Jul 17 '05 #3
Instead of refreshing to a static files, refresh to a php file that will
send back the file.

Lets say when the user click the link it brings him to some_page.php. In
this page you would put this code:

<META HTTP-EQUIV="refresh" content="1;
URL=http://yoursite.com/some/folder/file_gen.php">

file_gen.php should now generate the file and sent it back to be downloaded.
Without more detail about this generated file I can't tell you how exactly
to send it back. But here is a simple exemple that would return a
dynamically created javasctipt to be downloaded:

// The file is generated and its handler is contained by $file...
header('Content-type: application/javascript');
header("Content-length: ".filesize($file));
header('Content-Disposition: attachment; filename="destination_name.js"');
readfile($file);

You will find some more exemple in the user comments of the header() and
fread() manual pages:
http://ca3.php.net/manual/en/function.fread.php
http://ca3.php.net/header

Other function that might be useful:
http://ca3.php.net/manual/en/function.fwrite.php
http://ca3.php.net/manual/en/function.tempnam.php
http://ca3.php.net/manual/en/function.tmpfile.php

Dae

<ed******@virtualcad.com> wrote in message
news:11**********************@g44g2000cwa.googlegr oups.com...
Hello,

OK .. that makes sense. I didn't realize it was just waiting 5 seconds
to serve me a file that already exists. I thought it was processing a
file and serving it to me as soon as it was ready, which is what I need
to do.

The file I am going to serve the User can take anywhere from 3 to 30
seconds to create dynamically. If I use a value too low, the page will
refresh to 'Object not found'. If the value is too high, the User is
waiting longer than they should have to.

Here is what I want my application to do:

1. User clicks on a link.
2. Server sends HTML page explaining it may take up to 30 seconds.
3. Server sends file prompting a 'Save-As' as soon as it is ready.

I would like it better if there was no User interaction other than step
1.

Is this possible?

Eric

Jul 17 '05 #4
Dae,

Thanks! I came up with the same idea late last night while I was trying
to get to sleep. What I will do is refresh the page over and over until
the file is ready. On each refresh, I can show a 'progress bar'. When
the file is ready, the following refresh will send the file.

Eric

Jul 17 '05 #5
I don't understand why you want to refresh over and over ? If you create
your file within the file_gen.php file (from my previous exemple) and then
when the creation process is finished make the script sends the required
headers followed by fread('file') ... when you will do the refresh to that
file the browser should wait for the headers before taking any action (as
long as the browser request doesn't timed out). When it will receive it
since the header will specify Content-Disposition: attachment;
filename="destination_file_name.ext", then it should prompt to save the
file.

Dae
<ed******@virtualcad.com> wrote in message
news:11**********************@g47g2000cwa.googlegr oups.com...
Dae,

Thanks! I came up with the same idea late last night while I was trying
to get to sleep. What I will do is refresh the page over and over until
the file is ready. On each refresh, I can show a 'progress bar'. When
the file is ready, the following refresh will send the file.

Eric

Jul 17 '05 #6
Daedalus.OS wrote:
Content-Disposition: attachment; filename="destination_file_name.ext"


do browsers on the whole take heed of that line do you know?

--
Jock
Jul 17 '05 #7
This should work in all recent browser. Content-Disposition is stated as
experimental but is implemented in most (if not all) major browser.

I have tested it with IE6, FireFox 1.0, Netscape7.02, Opera7.5.4,
Mozilla1.7.3
I know there were issues on some browser that would result in displaying the
file if the content-type was a known text type or that would download the
file with an php or html extension.

I don't remenber wich browser and version have wich issue (I think IE5.5 was
one of those and FireFox 0.9 was the other), but I remember I was using
application/octet-stream as content-type for text file to solve this.

Dae
"John Dunlop" <us*********@john.dunlop.name> wrote in message
news:MP************************@news.ntlworld.com. ..
Daedalus.OS wrote:
Content-Disposition: attachment; filename="destination_file_name.ext"


do browsers on the whole take heed of that line do you know?

--
Jock

Jul 17 '05 #8
Dae,

Without a request from the client for another 'page' won't I receive
the 'Headers already sent' error?

Eric

Daedalus.OS wrote:
I don't understand why you want to refresh over and over ? If you create
your file within the file_gen.php file (from my previous exemple) and then
when the creation process is finished make the script sends the required
headers followed by fread('file') ... when you will do the refresh to that
file the browser should wait for the headers before taking any action (as
long as the browser request doesn't timed out). When it will receive it
since the header will specify Content-Disposition: attachment;
filename="destination_file_name.ext", then it should prompt to save the
file.

Dae
<ed******@virtualcad.com> wrote in message
news:11**********************@g47g2000cwa.googlegr oups.com...
Dae,

Thanks! I came up with the same idea late last night while I was trying
to get to sleep. What I will do is refresh the page over and over until
the file is ready. On each refresh, I can show a 'progress bar'. When
the file is ready, the following refresh will send the file.

Eric


Jul 17 '05 #9
Daedalus.OS ÐÉÛÅÔ:
Instead of refreshing to a static files, refresh to a php file that will
send back the file.

Lets say when the user click the link it brings him to some_page.php. In
this page you would put this code:

<META HTTP-EQUIV="refresh" content="1;
URL=http://yoursite.com/some/folder/file_gen.php">

file_gen.php should now generate the file and sent it back to be downloaded.
Without more detail about this generated file I can't tell you how exactly
to send it back. But here is a simple exemple that would return a
dynamically created javasctipt to be downloaded:

// The file is generated and its handler is contained by $file...
header('Content-type: application/javascript');
header("Content-length: ".filesize($file));
header('Content-Disposition: attachment; filename="destination_name.js"');
readfile($file);

Hows about $file that weight more then 8Mb ?
You can't do it with movie, for example.
Jul 17 '05 #10
In comp.lang.php Ivan Omelchenko 608308824 <ne**@omelchenko.com> wrote:
// The file is generated and its handler is contained by $file...
header('Content-type: application/javascript');
header("Content-length: ".filesize($file));
header('Content-Disposition: attachment; filename="destination_name.js"');
readfile($file);

Hows about $file that weight more then 8Mb ?
You can't do it with movie, for example.


Why do you think that? readfile() "Reads a file and writes it to the
output buffer." [http://nl3.php.net/readfile]. So it doesn't use any
memory in php other than:
-the buffers to read the file and write to the output buffer.
-the output buffer _if_ output buffering in php is set to on, not
something you want to do in these kind of scripts...

Jul 17 '05 #11
> Dae,

Without a request from the client for another 'page' won't I receive
the 'Headers already sent' error?

Eric


No. The thing here is that since you're calling it as a new page with a
<META HTTP-EQUIV="refresh"...>, the browser is actually waiting to receive a
totally new page with new headers. All what the page you call have to do is
making the file, send the proper header and the file. Since you're making it
as a Content-Disposition: attachment, the new page will not replace the
actual page in the browser but prompt to save it to disk instead.

So here is a simple view of what is happenning when a user click the link to
some_page.php:
-The browser receive the header for that page and display the page.
-Then the meta http-equiv="refresh"... attempt to refresh to file_gen.php
-The browser think he is going to another page and wait to receive the
headers
-file_gen.php create the file and then sends the headers + the file
-Browser receives the headers and see the Content-Disposition: attachment,
this mean (for the browser) do not display, prompt for download.

(This is a simplified view ... of course)

Dae
Jul 17 '05 #12
Hello Dae,

I get it now. However, as I have worked through this application, I
have decided on more functionality that adds to the 'requirements' of
the application. Basically, I need a Javascript 'Progress Bar' to let
the User know things are working. I also need to partially control the
progress bar from the server side. What I plan to do is simply use a
client side progress bar (so it is really a 'guesstimate' of progress)
and control from the server side if it is displayed or not.

Here is the flow I see before I added this requirement:

1. User clicks on link for some_page.php which loads.
2. Refresh in some_page.php asks for file_gen.php which starts creating
a file.
3. While user is waiting, the 'progress bar' on some_page.php begins.
4. file_gen.php completes file and sends to client.
5. User does a 'Save-As' (or Open-With etc).
6. some_page.php is still open and progress bar is still executing.

This is misleading since the progress is complete.

Here is what I propose, which minimizes the refreshes, but still allows
control over the progress bar. Let me know if this makes sense.

Better method:

1. User clicks on link for some_page.php which loads, with no progress
bar.
2. User specifies file creation parameters and clicks submit (manual
refresh).
3. Server sends back some_page.php with Javascript progress bar
started.
4. Refresh in some_page.php asks for file_gen.php which starts
creating file.
5. While User is waiting, the 'progress bar' on some_page.php
continues.
6. file_gen.php completes file and sends same some_page.php to client.
7. some_page.php now has a progress bar at 100%.
8. some_page.php also contains a refresh to a now existing file.
9. Page refreshes and User does a 'Save-As' (or Open-With etc).
10. some_page.php is still open with progress bar at 100%.
11. User can go back to step 2, which causes the progress bar to be
removed.

Note: The 'some_page.php' is actually a small dialog with only 2 small
jpegs. The file to be created can take up to 30 seconds on a FAST
machine. (Long story) If either of these facts were not true, I
wouldn't really like the above solution. But, I think in this case it
is the best solution.

Thoughts? Have I 'got it' now? :)

Thanks,

Eric

Daedalus.OS wrote:
Dae,

Without a request from the client for another 'page' won't I receive
the 'Headers already sent' error?

Eric


No. The thing here is that since you're calling it as a new page with a
<META HTTP-EQUIV="refresh"...>, the browser is actually waiting to receive a
totally new page with new headers. All what the page you call have to do is
making the file, send the proper header and the file. Since you're making it
as a Content-Disposition: attachment, the new page will not replace the
actual page in the browser but prompt to save it to disk instead.

So here is a simple view of what is happenning when a user click the link to
some_page.php:
-The browser receive the header for that page and display the page.
-Then the meta http-equiv="refresh"... attempt to refresh to file_gen.php
-The browser think he is going to another page and wait to receive the
headers
-file_gen.php create the file and then sends the headers + the file
-Browser receives the headers and see the Content-Disposition: attachment,
this mean (for the browser) do not display, prompt for download.

(This is a simplified view ... of course)

Dae


Jul 17 '05 #13
<ed******@virtualcad.com> kirjoitti
viestissä:11*********************@g14g2000cwa.goog legroups.com...
Hello Dae,

I get it now. However, as I have worked through this application, I
have decided on more functionality that adds to the 'requirements' of
the application. Basically, I need a Javascript 'Progress Bar' to let
the User know things are working. I also need to partially control the
progress bar from the server side. What I plan to do is simply use a
client side progress bar (so it is really a 'guesstimate' of progress)
and control from the server side if it is displayed or not.

Here is the flow I see before I added this requirement:

1. User clicks on link for some_page.php which loads.
2. Refresh in some_page.php asks for file_gen.php which starts creating
a file.
3. While user is waiting, the 'progress bar' on some_page.php begins.
4. file_gen.php completes file and sends to client.
5. User does a 'Save-As' (or Open-With etc).
6. some_page.php is still open and progress bar is still executing.

This is misleading since the progress is complete.

Here is what I propose, which minimizes the refreshes, but still allows
control over the progress bar. Let me know if this makes sense.

Better method:

1. User clicks on link for some_page.php which loads, with no progress
bar.
2. User specifies file creation parameters and clicks submit (manual
refresh).
3. Server sends back some_page.php with Javascript progress bar
started.
4. Refresh in some_page.php asks for file_gen.php which starts
creating file.
5. While User is waiting, the 'progress bar' on some_page.php
continues.
6. file_gen.php completes file and sends same some_page.php to client.
7. some_page.php now has a progress bar at 100%.
8. some_page.php also contains a refresh to a now existing file.
9. Page refreshes and User does a 'Save-As' (or Open-With etc).
10. some_page.php is still open with progress bar at 100%.
11. User can go back to step 2, which causes the progress bar to be
removed.

Note: The 'some_page.php' is actually a small dialog with only 2 small
jpegs. The file to be created can take up to 30 seconds on a FAST
machine. (Long story) If either of these facts were not true, I
wouldn't really like the above solution. But, I think in this case it
is the best solution.

Thoughts? Have I 'got it' now? :)

You 'got it' up to the point where you said 'I get it now'. Then you started
rambling about this crazy progressbar... Look, you can say to user
"generating file may take up to 30 seconds, please wait". And there's a
progressbar in all browsers I've seen so far. Call me old-fashioned, but I
think a) the users aren't that stupid that they would require another
progressbar and b) you'll just end up looking stupid with the thing.

Just a thought.

--
"I am pro death penalty. That way people learn
their lesson for the next time." -- Britney Spears

et****************@5P4Mgmail.com
Jul 17 '05 #14
Well I think it would work, but whether it make sense or not depends how bad
you want this progress bar. Personnaly I have to admit that I tend to agree
(in a more diplomatic way maybe) with kimmo. I don't see the use of a
progress bar since all browser shows its own page progress bar or elements
download status. Adding a message in this case would be as efficient IMHO as
a fake progress bar ... But still, I think it would work.

Dae

"Kimmo Laine" <et*******************@Mgmail.com> wrote in message
news:d7**********@phys-news1.kolumbus.fi...
<ed******@virtualcad.com> kirjoitti
viestissä:11*********************@g14g2000cwa.goog legroups.com...
Hello Dae,

I get it now. However, as I have worked through this application, I
have decided on more functionality that adds to the 'requirements' of
the application. Basically, I need a Javascript 'Progress Bar' to let
the User know things are working. I also need to partially control the
progress bar from the server side. What I plan to do is simply use a
client side progress bar (so it is really a 'guesstimate' of progress)
and control from the server side if it is displayed or not.

Here is the flow I see before I added this requirement:

1. User clicks on link for some_page.php which loads.
2. Refresh in some_page.php asks for file_gen.php which starts creating
a file.
3. While user is waiting, the 'progress bar' on some_page.php begins.
4. file_gen.php completes file and sends to client.
5. User does a 'Save-As' (or Open-With etc).
6. some_page.php is still open and progress bar is still executing.

This is misleading since the progress is complete.

Here is what I propose, which minimizes the refreshes, but still allows
control over the progress bar. Let me know if this makes sense.

Better method:

1. User clicks on link for some_page.php which loads, with no progress
bar.
2. User specifies file creation parameters and clicks submit (manual
refresh).
3. Server sends back some_page.php with Javascript progress bar
started.
4. Refresh in some_page.php asks for file_gen.php which starts
creating file.
5. While User is waiting, the 'progress bar' on some_page.php
continues.
6. file_gen.php completes file and sends same some_page.php to client.
7. some_page.php now has a progress bar at 100%.
8. some_page.php also contains a refresh to a now existing file.
9. Page refreshes and User does a 'Save-As' (or Open-With etc).
10. some_page.php is still open with progress bar at 100%.
11. User can go back to step 2, which causes the progress bar to be
removed.

Note: The 'some_page.php' is actually a small dialog with only 2 small
jpegs. The file to be created can take up to 30 seconds on a FAST
machine. (Long story) If either of these facts were not true, I
wouldn't really like the above solution. But, I think in this case it
is the best solution.

Thoughts? Have I 'got it' now? :)

You 'got it' up to the point where you said 'I get it now'. Then you
started rambling about this crazy progressbar... Look, you can say to user
"generating file may take up to 30 seconds, please wait". And there's a
progressbar in all browsers I've seen so far. Call me old-fashioned, but I
think a) the users aren't that stupid that they would require another
progressbar and b) you'll just end up looking stupid with the thing.

Just a thought.

--
"I am pro death penalty. That way people learn
their lesson for the next time." -- Britney Spears

et****************@5P4Mgmail.com

Jul 17 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Kurda Yon | last post by:
Sorry for a very stupid question. Can you tell me what does the following html source does if I press button "Send"? If I read this code by Netscaspe from my local file system and then press...
0
by: CS | last post by:
I am using FAXCOMEXLib.dll to send fax here. When I send a .txt file to the fax and it has no problem, but when I send a .html file to fax, it pops up a dialog box and asking me to login....
3
by: marsandys | last post by:
Hello, I have this code below, which I am trying to have it send HTML formatted mail with embedded images. I can get this to send the mail, but it spits out a bunch of junk . I know this should...
0
by: THC | last post by:
What I am trying to achieve is to email an ASP.NET page from the server side. The page needs to be in its final result, meaning all server controls have been resolved and there's only straight...
4
by: Franck Diastein | last post by:
Hi, I'm trying to send a file to the browser with Response.Write, and it works great. The problem (I guess...) is that the code that sends the file is in a class, and whan I load aspx file...
13
by: bmurphy | last post by:
Last week after much searching, I found the answer to my problem in this newsgroup. I can't find the thread from which I got my solution, but I wanted to report back what worked. When the site...
2
by: fmakopo | last post by:
I am trying to save html page using C# because i want to save the page on the server not on the client side. I can do that using Javascript the problem that i am having i want to save the page on...
11
by: nickyeng | last post by:
I have a html file contains a form asking user to select a choice and press enter to pass the data to server. In server there, i have a cgi script(C language) that accepts the input from browser...
4
by: dcrackel | last post by:
I hope there is a simple solution to this, but I've been unable to find it. $dom = new DomDocument(); $dom->load("test.xml"); $test = $dom->getElementsByTagName("test"); $test->nodeValue =...
6
by: Peter Pei | last post by:
I am trying to read a web page and save it in a .html file. The problem is that the web page is GB-2312 encoded, and I want to save it to the file with the same encoding or unicode. I have some...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.