16

I want to write a text file in the server through Php, and have the client to download that file.

How would i do that?

Essentially the client should be able to download the file from the server.

Kent Fredric
  • 56,416
  • 14
  • 107
  • 150

5 Answers5

18

This is the best way to do it, supposing you don't want the user to see the real URL of the file.

<?php
  $filename="download.txt";
  header("Content-disposition: attachment;filename=$filename");
  readfile($filename);
?>

Additionally, you could protect your files with mod_access.

Flavius
  • 13,566
  • 13
  • 80
  • 126
14

In addition to the data already posted, there is a header you might want to try.

Its only a suggestion to how its meant to be handled, and the user agent can chose to ignore it, and simply display the file in the window if it knows how:

<?php

 header('Content-Type: text/plain');         # its a text file
 header('Content-Disposition: attachment');  # hit to trigger external mechanisms instead of inbuilt

See Rfc2183 for more on the Content-Disposition header.

Kent Fredric
  • 56,416
  • 14
  • 107
  • 150
5

PHP has a number of very simplistic, C-like functions for writing to files. Here is an easy example:

<?php
// first parameter is the filename
//second parameter is the modifier: r=read, w=write, a=append
$handle = fopen("logs/thisFile.txt", "w");

$myContent = "This is my awesome string!";

// actually write the file contents
fwrite($handle, $myContent);

// close the file pointer
fclose($handle);
?>

It's a very basic example, but you can find more references to this sort of operation here:

PHP fopen

Anthony
  • 7,086
  • 1
  • 21
  • 22
3

If you set the content type to application/octet-stream, the browser will ALWAYS offer file as a download, and will never attempt to display it internally, no matter what type of file it is.

<?php
  filename="download.txt";
  header("Content-type: application/octet-stream");
  header("Content-disposition: attachment;filename=$filename");

  // output file content here
?>
tylerl
  • 30,197
  • 13
  • 80
  • 113
  • PS: although it might work with the little d on some UA's, its *not* the RFC spec so you're best to use the upper-case version. – Kent Fredric Apr 10 '09 at 08:56
  • the other problem with relying on octet-stream, is you force the user to save it, because it cant use MIME to determine what application to open it with externally, and that's a problem. – Kent Fredric Apr 10 '09 at 09:00
  • @Kent Fredric: According to RFC, the header names are case-insensitive. – tylerl Apr 10 '09 at 17:54
  • 2
    @Kent Fredric: Forcing the user to save instead of open an external app was kind of the point. – tylerl Apr 10 '09 at 17:55
  • @tylerl yeah, but in this specific case, the OP is actually trying to open notepad with a predetermined string, but you probably wouldn't have know that without seeing their prior post. http://stackoverflow.com/questions/736942/opening-notepad-exe-with-javascript – Kent Fredric Apr 11 '09 at 04:53
2

Just post a link on the site to http://example.com/textfile.php

And in that PHP file you put the following code:

<?php
header('Content-Type: text/plain');
print "The output text";
?>

That way you can create the content dynamic (from a database)... Try to Google to oter "Content-Type" if this one is not the one you are looking for.

Thomas Orlita
  • 1,554
  • 14
  • 28
To1ne
  • 1,108
  • 2
  • 12
  • 22