how do I tell a browser the name of a file, for download, if the file has open space in its name?

how do I tell a browser the name of a file, for download, if the file has open space in its name?

am 20.10.2007 11:32:02 von Jake Barnes

I've got a music studio for a client. Their whole studio is run with
Macintosh computers. Macintosh computers allow file names to have open
white spaces, such as "animal hospital.mp3".

I have a download script, so customers on the website can download
MP3s to their harddrive (rather than merely listen to it in their
browsers):



$fileToBuy = $_GET["fileToBuy"];
if ($fileToBuy) {
$pathToFile = "temporary_files/$fileToBuy";
if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
$fileToBuy";
if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
site_specific_files/$fileToBuy";

if (file_exists($pathToFile)) {
$size = @ filesize($pathToFile);
if ($size > 1) {
header("Content-Type: application/octet-stream");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename=$fileToBuy");
header("Content-Transfer-Encoding: binary");
$pathToFile = urlencode($pathToFile);
$fh = fopen("$pathToFile", "r");
fpassthru($fh);
} else {
echo "Sorry, but we are unable to process this file at this
time.";
}
} else {
echo "Sorry, but we can not find a file named '$fileToBuy' at
'$pathToFile'. ";
}
} else {
echo "Sorry, but there doesn't seem to be a file named in the URL
(fileToDownload needed in url).";
}



This works fine except when it encounters a file with an open space in
it, and the studio has several thousand mp3s which have open spaces in
their name.

If a file has an open space, the above code seems to truncate the file
name at the first open white space. Instead of "animal hospital.mp3",
the browser starts to download "animal", with no file extension. And
the download fails - instead of 6 megabytes, only 1 kilobyte
downloads.

Any insights?

Re: how do I tell a browser the name of a file, for download, ifthe file has open space in its name?

am 20.10.2007 12:33:10 von Courtney

lawrence k wrote:
> I've got a music studio for a client. Their whole studio is run with
> Macintosh computers. Macintosh computers allow file names to have open
> white spaces, such as "animal hospital.mp3".
>
> I have a download script, so customers on the website can download
> MP3s to their harddrive (rather than merely listen to it in their
> browsers):
>
>
>
> $fileToBuy = $_GET["fileToBuy"];
> if ($fileToBuy) {
> $pathToFile = "temporary_files/$fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> $fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> site_specific_files/$fileToBuy";
>
> if (file_exists($pathToFile)) {
> $size = @ filesize($pathToFile);
> if ($size > 1) {
> header("Content-Type: application/octet-stream");
> header("Content-Length: $size");
> header("Content-Disposition: attachment; filename=$fileToBuy");
> header("Content-Transfer-Encoding: binary");
> $pathToFile = urlencode($pathToFile);
> $fh = fopen("$pathToFile", "r");
> fpassthru($fh);
> } else {
> echo "Sorry, but we are unable to process this file at this
> time.";
> }
> } else {
> echo "Sorry, but we can not find a file named '$fileToBuy' at
> '$pathToFile'. ";
> }
> } else {
> echo "Sorry, but there doesn't seem to be a file named in the URL
> (fileToDownload needed in url).";
> }
>
>
>
> This works fine except when it encounters a file with an open space in
> it, and the studio has several thousand mp3s which have open spaces in
> their name.
>
> If a file has an open space, the above code seems to truncate the file
> name at the first open white space. Instead of "animal hospital.mp3",
> the browser starts to download "animal", with no file extension. And
> the download fails - instead of 6 megabytes, only 1 kilobyte
> downloads.
>
> Any insights?
>

Yu are looking n the wrong place.

is what happens before the first line that interests me

$fileToBuy = $_GET["fileToBuy"];

How is that GET variable generated, and what does

echo $filetobuy;

display?

My guess is the name is truncated before it even reaches the part you
showed us.

Re: how do I tell a browser the name of a file, for download, if the file has open space in its name

am 20.10.2007 16:33:59 von Anonymous

lawrence k wrote:
>
> I've got a music studio for a client. Their whole studio is run with
> Macintosh computers. Macintosh computers allow file names to have open
> white spaces, such as "animal hospital.mp3".

> This works fine except when it encounters a file with an open space in
> it, and the studio has several thousand mp3s which have open spaces in
> their name.
>
> If a file has an open space, the above code seems to truncate the file
> name at the first open white space. Instead of "animal hospital.mp3",
> the browser starts to download "animal", with no file extension. And
> the download fails - instead of 6 megabytes, only 1 kilobyte
> downloads.
>
> Any insights?

A space is %20, IIRC. Try rawurlencode() instead of urlencode().

Bye!

Re: how do I tell a browser the name of a file, for download, if the file has open space in its name

am 20.10.2007 18:44:14 von Jake Barnes

On Oct 20, 6:33 am, The Natural Philosopher wrote:
> lawrence k wrote:
> > I've got a music studio for a client. Their whole studio is run with
> > Macintosh computers. Macintosh computers allow file names to have open
> > white spaces, such as "animal hospital.mp3".
>
> > I have a download script, so customers on the website can download
> > MP3s to their harddrive (rather than merely listen to it in their
> > browsers):
>
> > $fileToBuy = $_GET["fileToBuy"];
> > if ($fileToBuy) {
> > $pathToFile = "temporary_files/$fileToBuy";
> > if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> > $fileToBuy";
> > if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> > site_specific_files/$fileToBuy";
>
> > if (file_exists($pathToFile)) {
> > $size = @ filesize($pathToFile);
> > if ($size > 1) {
> > header("Content-Type: application/octet-stream");
> > header("Content-Length: $size");
> > header("Content-Disposition: attachment; filename=$fileToBuy");
> > header("Content-Transfer-Encoding: binary");
> > $pathToFile = urlencode($pathToFile);
> > $fh = fopen("$pathToFile", "r");
> > fpassthru($fh);
> > } else {
> > echo "Sorry, but we are unable to process this file at this
> > time.";
> > }
> > } else {
> > echo "Sorry, but we can not find a file named '$fileToBuy' at
> > '$pathToFile'. ";
> > }
> > } else {
> > echo "Sorry, but there doesn't seem to be a file named in the URL
> > (fileToDownload needed in url).";
> > }
>
> > This works fine except when it encounters a file with an open space in
> > it, and the studio has several thousand mp3s which have open spaces in
> > their name.
>
> > If a file has an open space, the above code seems to truncate the file
> > name at the first open white space. Instead of "animal hospital.mp3",
> > the browser starts to download "animal", with no file extension. And
> > the download fails - instead of 6 megabytes, only 1 kilobyte
> > downloads.
>
> > Any insights?
>
> Yu are looking n the wrong place.
>
> is what happens before the first line that interests me
>
> $fileToBuy = $_GET["fileToBuy"];
>
> How is that GET variable generated, and what does
>
> echo $filetobuy;
>
> display?
>
> My guess is the name is truncated before it even reaches the part you
> showed us.


If I echo $fileToBuy to screen, I get the whole the file name. All the
file_exists() tests would fail, if $_GET wasn't returning the whole
file name.

However, I've added an if() test to see if I truly did get a file
handle back from fopen(). The strange thing is, this test does not
fail, meaning PHP was able to find the file. Check out this url:

http://www.monkeyclaus.org/download.php?fileToDownload=Diari o%20-%20Things%20In%20the%20Mirror%20Appear%20Closer%20Than% 20They%20Are%20-%2004%20-%20Coins%20Coins%20Coins.mp3


The code now looks like this:


$fileToBuy = $_GET["fileToBuy"];
if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];

if ($fileToBuy) {
$pathToFile = "temporary_files/$fileToBuy";
if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
$fileToBuy";
if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
site_specific_files/$fileToBuy";

if (file_exists($pathToFile)) {
$size = @ filesize($pathToFile);
if ($size > 1) {
header("Content-Type: application/octet-stream");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename=$fileToBuy");
header("Content-Transfer-Encoding: binary");
$fh = fopen("$pathToFile", "r");
if ($fh) {
fpassthru($fh);
} else {
echo "Error: can't find file '$fileToBuy' ";
}
} else {
echo "Sorry, but we are unable to process this file at this
time.";
}
} else {
echo "Sorry, but we can not find a file named '$fileToBuy' at
'$pathToFile'. ";
}
} else {
echo "Sorry, but there doesn't seem to be a file named in the URL
(fileToDownload needed in url).";
}



Why is the file name getting truncated? Is this an HTTP header issue?

Re: how do I tell a browser the name of a file, for download, if the file has open space in its name

am 20.10.2007 19:01:47 von Puckdropper

lawrence k wrote in
news:1192898654.783609.289650@e34g2000pro.googlegroups.com:

> On Oct 20, 6:33 am, The Natural Philosopher wrote:
>> lawrence k wrote:
>> > I've got a music studio for a client. Their whole studio is run
>> > with Macintosh computers. Macintosh computers allow file names to
>> > have open white spaces, such as "animal hospital.mp3".
>>
>> > I have a download script, so customers on the website can download
>> > MP3s to their harddrive (rather than merely listen to it in their
>> > browsers):
>>
>> > $fileToBuy = $_GET["fileToBuy"];
>> > if ($fileToBuy) {
>> > $pathToFile = "temporary_files/$fileToBuy";
>> > if (!file_exists($pathToFile)) $pathToFile =
>> > "site_specific_files/
>> > $fileToBuy";
>> > if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
>> > site_specific_files/$fileToBuy";
>>
>> > if (file_exists($pathToFile)) {
>> > $size = @ filesize($pathToFile);
>> > if ($size > 1) {
>> > header("Content-Type:
>> > application/octet-stream");
>> > header("Content-Length: $size");
>> > header("Content-Disposition: attachment;
>> > filename=$fileToBuy");
>> > header("Content-Transfer-Encoding: binary");
>> > $pathToFile = urlencode($pathToFile);
>> > $fh = fopen("$pathToFile", "r");
>> > fpassthru($fh);
>> > } else {
>> > echo "Sorry, but we are unable to process this
>> > file at this
>> > time.";
>> > }
>> > } else {
>> > echo "Sorry, but we can not find a file named
>> > '$fileToBuy' at
>> > '$pathToFile'. ";
>> > }
>> > } else {
>> > echo "Sorry, but there doesn't seem to be a file named in the
>> > URL
>> > (fileToDownload needed in url).";
>> > }
>>
>> > This works fine except when it encounters a file with an open space
>> > in it, and the studio has several thousand mp3s which have open
>> > spaces in their name.
>>
>> > If a file has an open space, the above code seems to truncate the
>> > file name at the first open white space. Instead of "animal
>> > hospital.mp3", the browser starts to download "animal", with no
>> > file extension. And the download fails - instead of 6 megabytes,
>> > only 1 kilobyte downloads.
>>
>> > Any insights?
>>
>> Yu are looking n the wrong place.
>>
>> is what happens before the first line that interests me
>>
>> $fileToBuy = $_GET["fileToBuy"];
>>
>> How is that GET variable generated, and what does
>>
>> echo $filetobuy;
>>
>> display?
>>
>> My guess is the name is truncated before it even reaches the part you
>> showed us.
>
>
> If I echo $fileToBuy to screen, I get the whole the file name. All the
> file_exists() tests would fail, if $_GET wasn't returning the whole
> file name.
>
> However, I've added an if() test to see if I truly did get a file
> handle back from fopen(). The strange thing is, this test does not
> fail, meaning PHP was able to find the file. Check out this url:
>
> http://www.monkeyclaus.org/download.php?fileToDownload=Diari o%20-%20Thi
> ngs%20In%20the%20Mirror%20Appear%20Closer%20Than%20They%20Ar e%20-%2004%
> 20-%20Coins%20Coins%20Coins.mp3
>
>
> The code now looks like this:
>
>
> $fileToBuy = $_GET["fileToBuy"];
> if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];
>
> if ($fileToBuy) {
> $pathToFile = "temporary_files/$fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile =
> "site_specific_files/
> $fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> site_specific_files/$fileToBuy";
>
> if (file_exists($pathToFile)) {
> $size = @ filesize($pathToFile);
> if ($size > 1) {
> header("Content-Type: application/octet-stream");
> header("Content-Length: $size");
> header("Content-Disposition: attachment;
> filename=$fileToBuy");
> header("Content-Transfer-Encoding: binary");
> $fh = fopen("$pathToFile", "r");
> if ($fh) {
> fpassthru($fh);
> } else {
> echo "Error: can't find file '$fileToBuy' ";
> }
> } else {
> echo "Sorry, but we are unable to process this file at
> this
> time.";
> }
> } else {
> echo "Sorry, but we can not find a file named '$fileToBuy'
> at
> '$pathToFile'. ";
> }
> } else {
> echo "Sorry, but there doesn't seem to be a file named in the URL
> (fileToDownload needed in url).";
> }
>
>
>
> Why is the file name getting truncated? Is this an HTTP header issue?
>
>

I solved a similar problem by making sure all my fields had quotation
marks around them. Your filename field is the most likely to need them,
if allowed in the header.

Puckdropper
--
Wise is the man who attempts to answer his question before asking it.

To email me directly, send a message to puckdropper (at) fastmail.fm

Re: how do I tell a browser the name of a file, for download, if the file has open space in its name

am 20.10.2007 19:03:11 von Jake Barnes

On Oct 20, 12:44 pm, lawrence k wrote:
> On Oct 20, 6:33 am, The Natural Philosopher wrote:
>
>
>
> > lawrence k wrote:
> > > I've got a music studio for a client. Their whole studio is run with
> > > Macintosh computers. Macintosh computers allow file names to have open
> > > white spaces, such as "animal hospital.mp3".
>
> > > I have a download script, so customers on the website can download
> > > MP3s to their harddrive (rather than merely listen to it in their
> > > browsers):
>
> > > $fileToBuy = $_GET["fileToBuy"];
> > > if ($fileToBuy) {
> > > $pathToFile = "temporary_files/$fileToBuy";
> > > if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> > > $fileToBuy";
> > > if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> > > site_specific_files/$fileToBuy";
>
> > > if (file_exists($pathToFile)) {
> > > $size = @ filesize($pathToFile);
> > > if ($size > 1) {
> > > header("Content-Type: application/octet-stream");
> > > header("Content-Length: $size");
> > > header("Content-Disposition: attachment; filename=$fileToBuy");
> > > header("Content-Transfer-Encoding: binary");
> > > $pathToFile = urlencode($pathToFile);
> > > $fh = fopen("$pathToFile", "r");
> > > fpassthru($fh);
> > > } else {
> > > echo "Sorry, but we are unable to process this file at this
> > > time.";
> > > }
> > > } else {
> > > echo "Sorry, but we can not find a file named '$fileToBuy' at
> > > '$pathToFile'. ";
> > > }
> > > } else {
> > > echo "Sorry, but there doesn't seem to be a file named in the URL
> > > (fileToDownload needed in url).";
> > > }
>
> > > This works fine except when it encounters a file with an open space in
> > > it, and the studio has several thousand mp3s which have open spaces in
> > > their name.
>
> However, I've added an if() test to see if I truly did get a file
> handle back from fopen(). The strange thing is, this test does not
> fail, meaning PHP was able to find the file. Check out this url:
>
> http://www.monkeyclaus.org/download.php?fileToDownload=Diari o%20-%20T...
>
> The code now looks like this:
>
> $fileToBuy = $_GET["fileToBuy"];
> if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];
>
> if ($fileToBuy) {
> $pathToFile = "temporary_files/$fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> $fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> site_specific_files/$fileToBuy";
>
> if (file_exists($pathToFile)) {
> $size = @ filesize($pathToFile);
> if ($size > 1) {
> header("Content-Type: application/octet-stream");
> header("Content-Length: $size");
> header("Content-Disposition: attachment; filename=$fileToBuy");
> header("Content-Transfer-Encoding: binary");
> $fh = fopen("$pathToFile", "r");
> if ($fh) {
> fpassthru($fh);
> } else {
> echo "Error: can't find file '$fileToBuy' ";
> }
> } else {
> echo "Sorry, but we are unable to process this file at this
> time.";
> }
> } else {
> echo "Sorry, but we can not find a file named '$fileToBuy' at
> '$pathToFile'. ";
> }} else {
>
> echo "Sorry, but there doesn't seem to be a file named in the URL
> (fileToDownload needed in url).";
>
> }
>
> Why is the file name getting truncated? Is this an HTTP header issue?


Okay, it was an HTTP header issue. I've changed the code like this:


header("Content-Type: application/octet-stream");
header("Content-Length: $size");
$fileToBuy = rawurlencode($fileToBuy);
header("Content-Disposition: attachment; filename=$fileToBuy");
header("Content-Transfer-Encoding: binary");
$fh = fopen("$pathToFile", "r");
if ($fh) {
fpassthru($fh);
} else {
echo "Error: can't find file '$fileToBuy' ";
}



Now that $fileToBuy is hit with rawurlencode before getting put into
the HTTP header, the file downloads correctly. I was able to download
a file and play it in iTunes.

However, the file downloads with a bunch of ugly %20 in the file
names. Can anyone think of a way I can get them out of the filenames?

Re: how do I tell a browser the name of a file, for download, ifthe file has open space in its name?

am 20.10.2007 23:11:53 von Courtney

lawrence k wrote:
> On Oct 20, 12:44 pm, lawrence k wrote:
>> On Oct 20, 6:33 am, The Natural Philosopher wrote:
>>
>>
>>
>>> lawrence k wrote:
>>>> I've got a music studio for a client. Their whole studio is run with
>>>> Macintosh computers. Macintosh computers allow file names to have open
>>>> white spaces, such as "animal hospital.mp3".
>>>> I have a download script, so customers on the website can download
>>>> MP3s to their harddrive (rather than merely listen to it in their
>>>> browsers):
>>>> $fileToBuy = $_GET["fileToBuy"];
>>>> if ($fileToBuy) {
>>>> $pathToFile = "temporary_files/$fileToBuy";
>>>> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
>>>> $fileToBuy";
>>>> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
>>>> site_specific_files/$fileToBuy";
>>>> if (file_exists($pathToFile)) {
>>>> $size = @ filesize($pathToFile);
>>>> if ($size > 1) {
>>>> header("Content-Type: application/octet-stream");
>>>> header("Content-Length: $size");
>>>> header("Content-Disposition: attachment; filename=$fileToBuy");
>>>> header("Content-Transfer-Encoding: binary");
>>>> $pathToFile = urlencode($pathToFile);
>>>> $fh = fopen("$pathToFile", "r");
>>>> fpassthru($fh);
>>>> } else {
>>>> echo "Sorry, but we are unable to process this file at this
>>>> time.";
>>>> }
>>>> } else {
>>>> echo "Sorry, but we can not find a file named '$fileToBuy' at
>>>> '$pathToFile'. ";
>>>> }
>>>> } else {
>>>> echo "Sorry, but there doesn't seem to be a file named in the URL
>>>> (fileToDownload needed in url).";
>>>> }
>>>> This works fine except when it encounters a file with an open space in
>>>> it, and the studio has several thousand mp3s which have open spaces in
>>>> their name.
>> However, I've added an if() test to see if I truly did get a file
>> handle back from fopen(). The strange thing is, this test does not
>> fail, meaning PHP was able to find the file. Check out this url:
>>
>> http://www.monkeyclaus.org/download.php?fileToDownload=Diari o%20-%20T...
>>
>> The code now looks like this:
>>
>> $fileToBuy = $_GET["fileToBuy"];
>> if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];
>>
>> if ($fileToBuy) {
>> $pathToFile = "temporary_files/$fileToBuy";
>> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
>> $fileToBuy";
>> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
>> site_specific_files/$fileToBuy";
>>
>> if (file_exists($pathToFile)) {
>> $size = @ filesize($pathToFile);
>> if ($size > 1) {
>> header("Content-Type: application/octet-stream");
>> header("Content-Length: $size");
>> header("Content-Disposition: attachment; filename=$fileToBuy");
>> header("Content-Transfer-Encoding: binary");
>> $fh = fopen("$pathToFile", "r");
>> if ($fh) {
>> fpassthru($fh);
>> } else {
>> echo "Error: can't find file '$fileToBuy' ";
>> }
>> } else {
>> echo "Sorry, but we are unable to process this file at this
>> time.";
>> }
>> } else {
>> echo "Sorry, but we can not find a file named '$fileToBuy' at
>> '$pathToFile'. ";
>> }} else {
>>
>> echo "Sorry, but there doesn't seem to be a file named in the URL
>> (fileToDownload needed in url).";
>>
>> }
>>
>> Why is the file name getting truncated? Is this an HTTP header issue?
>
>
> Okay, it was an HTTP header issue. I've changed the code like this:
>
>
> header("Content-Type: application/octet-stream");
> header("Content-Length: $size");
> $fileToBuy = rawurlencode($fileToBuy);
> header("Content-Disposition: attachment; filename=$fileToBuy");
> header("Content-Transfer-Encoding: binary");
> $fh = fopen("$pathToFile", "r");
> if ($fh) {
> fpassthru($fh);
> } else {
> echo "Error: can't find file '$fileToBuy' ";
> }
>
>
>
> Now that $fileToBuy is hit with rawurlencode before getting put into
> the HTTP header, the file downloads correctly. I was able to download
> a file and play it in iTunes.
>
> However, the file downloads with a bunch of ugly %20 in the file
> names. Can anyone think of a way I can get them out of the filenames?
>
>
>
Sure, Use a regexp to sustitute the %20 with a space In the header part
that defines the name,

..

There may be a function to do that..

Re: how do I tell a browser the name of a file, for download, if the

am 16.11.2007 20:24:45 von Jake Barnes

On Oct 20, 11:44 am, lawrence k wrote:
> On Oct 20, 6:33 am, The Natural Philosopher wrote:
>
>
>
> > lawrence k wrote:
> > > I've got a music studio for a client. Their whole studio is run with
> > > Macintosh computers. Macintosh computers allow file names to have open=

> > > white spaces, such as "animal hospital.mp3".
>
> > > I have a download script, so customers on the website can download
> > > MP3s to their harddrive (rather than merely listen to it in their
> > > browsers):
>
> > > $fileToBuy =3D $_GET["fileToBuy"];
> > > if ($fileToBuy) {
> > > $pathToFile =3D "temporary_files/$fileToBuy";
> > > if (!file_exists($pathToFile)) $pathToFile =3D "site_specific_files=
/
> > > $fileToBuy";
> > > if (!file_exists($pathToFile)) $pathToFile =3D "../httpdocs/
> > > site_specific_files/$fileToBuy";
>
> > > if (file_exists($pathToFile)) {
> > > $size =3D @ filesize($pathToFile);
> > > if ($size > 1) {
> > > header("Content-Type: application/octet-stream");
> > > header("Content-Length: $size");
> > > header("Content-Disposition: attachment; filename=
=3D$fileToBuy");
> > > header("Content-Transfer-Encoding: binary");
> > > $pathToFile =3D urlencode($pathToFile);
> > > $fh =3D fopen("$pathToFile", "r");
> > > fpassthru($fh);
> > > } else {
> > > echo "Sorry, but we are unable to process this file=
at this
> > > time.";
> > > }
> > > } else {
> > > echo "Sorry, but we can not find a file named '$fileToBuy' =
at
> > > '$pathToFile'. ";
> > > }
> > > } else {
> > > echo "Sorry, but there doesn't seem to be a file named in the URL
> > > (fileToDownload needed in url).";
> > > }
>
> > > This works fine except when it encounters a file with an open space in=

> > > it, and the studio has several thousand mp3s which have open spaces in=

> > > their name.
>
> > > If a file has an open space, the above code seems to truncate the file=

> > > name at the first open white space. Instead of "animal hospital.mp3",
> > > the browser starts to download "animal", with no file extension. And
> > > the download fails - instead of 6 megabytes, only 1 kilobyte
> > > downloads.
>
> > > Any insights?
>
> > Yu are looking n the wrong place.
>
> > is what happens before the first line that interests me
>
> > $fileToBuy =3D $_GET["fileToBuy"];
>
> > How is that GET variable generated, and what does
>
> > echo $filetobuy;
>
> > display?
>
> > My guess is the name is truncated before it even reaches the part you
> > showed us.
>
> If I echo $fileToBuy to screen, I get the whole the file name. All the
> file_exists() tests would fail, if $_GET wasn't returning the whole
> file name.
>
> However, I've added an if() test to see if I truly did get a file
> handle back from fopen(). The strange thing is, this test does not
> fail, meaning PHP was able to find the file. Check out this url:
>
> http://www.monkeyclaus.org/download.php?fileToDownload=3DDia rio%20-%20T...=

>
> The code now looks like this:
>
> $fileToBuy =3D $_GET["fileToBuy"];
> if (!$fileToBuy) $fileToBuy =3D $_GET["fileToDownload"];
>
> if ($fileToBuy) {
> $pathToFile =3D "temporary_files/$fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile =3D "site_specific_file=
s/
> $fileToBuy";
> if (!file_exists($pathToFile)) $pathToFile =3D "../httpdocs/
> site_specific_files/$fileToBuy";
>
> if (file_exists($pathToFile)) {
> $size =3D @ filesize($pathToFile);
> if ($size > 1) {
> header("Content-Type: application/octet-stream");
> header("Content-Length: $size");
> header("Content-Disposition: attachment; filename=
=3D$fileToBuy");
> header("Content-Transfer-Encoding: binary");
> $fh =3D fopen("$pathToFile", "r");
> if ($fh) {
> fpassthru($fh);
> } else {
> echo "Error: can't find file '$fileToBuy' =
";
> }
> } else {
> echo "Sorry, but we are unable to process this fil=
e at this
> time.";
> }
> } else {
> echo "Sorry, but we can not find a file named '$fileToBuy'=
at
> '$pathToFile'. ";
> }} else {
>
> echo "Sorry, but there doesn't seem to be a file named in the URL
> (fileToDownload needed in url).";
>
> }
>
> Why is the file name getting truncated? Is this an HTTP header issue?




Now our customers are starting to complain. We just got this email:

Thanks again. I'm having problems getting 'Beautys Grace' and 'This
Time It's'.ï¿=BD
When clicking the links for those I get the following:
Sorry, but we can not find a file named 'A Whisper In The Noise - Dry
Land - 04 - This Time It\'s.mp3' at '../httpdocs/site_specific_files/A
Whisper In The Noise - Dry Land - 04 - This Time It\'s.mp3'.
Also might be worth noting that your file names have %20 characters
where your spaces should be.
i.e: A%20Whisper%20In%20The%20Noise%20-%20Dry%20Land%20-%2001%20- %20As
%20We%20Were.mp3


No other music store seems to have this problem, so I imagine the fix
is an easy one. Does anyone know what the fix is?

Re: how do I tell a browser the name of a file, for download, if the

am 16.11.2007 20:27:18 von Jake Barnes

On Oct 20, 4:11 pm, The Natural Philosopher wrote:
> lawrence k wrote:
> > On Oct 20, 12:44 pm, lawrence k wrote:
> >> On Oct 20, 6:33 am, The Natural Philosopher wrote:
>
> >>> lawrence k wrote:
> >>>> I've got a music studio for a client. Their whole studio is run with
> >>>> Macintosh computers. Macintosh computers allow file names to have open
> >>>> white spaces, such as "animal hospital.mp3".
> >>>> I have a download script, so customers on the website can download
> >>>> MP3s to their harddrive (rather than merely listen to it in their
> >>>> browsers):
> >>>> $fileToBuy = $_GET["fileToBuy"];
> >>>> if ($fileToBuy) {
> >>>> $pathToFile = "temporary_files/$fileToBuy";
> >>>> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> >>>> $fileToBuy";
> >>>> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> >>>> site_specific_files/$fileToBuy";
> >>>> if (file_exists($pathToFile)) {
> >>>> $size = @ filesize($pathToFile);
> >>>> if ($size > 1) {
> >>>> header("Content-Type: application/octet-stream");
> >>>> header("Content-Length: $size");
> >>>> header("Content-Disposition: attachment; filename=$fileToBuy");
> >>>> header("Content-Transfer-Encoding: binary");
> >>>> $pathToFile = urlencode($pathToFile);
> >>>> $fh = fopen("$pathToFile", "r");
> >>>> fpassthru($fh);
> >>>> } else {
> >>>> echo "Sorry, but we are unable to process this file at this
> >>>> time.";
> >>>> }
> >>>> } else {
> >>>> echo "Sorry, but we can not find a file named '$fileToBuy' at
> >>>> '$pathToFile'. ";
> >>>> }
> >>>> } else {
> >>>> echo "Sorry, but there doesn't seem to be a file named in the URL
> >>>> (fileToDownload needed in url).";
> >>>> }
> >>>> This works fine except when it encounters a file with an open space in
> >>>> it, and the studio has several thousand mp3s which have open spaces in
> >>>> their name.
> >> However, I've added an if() test to see if I truly did get a file
> >> handle back from fopen(). The strange thing is, this test does not
> >> fail, meaning PHP was able to find the file. Check out this url:
>
> >>http://www.monkeyclaus.org/download.php?fileToDownload=Dia rio%20-%20T...
>
> >> The code now looks like this:
>
> >> $fileToBuy = $_GET["fileToBuy"];
> >> if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];
>
> >> if ($fileToBuy) {
> >> $pathToFile = "temporary_files/$fileToBuy";
> >> if (!file_exists($pathToFile)) $pathToFile = "site_specific_files/
> >> $fileToBuy";
> >> if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> >> site_specific_files/$fileToBuy";
>
> >> if (file_exists($pathToFile)) {
> >> $size = @ filesize($pathToFile);
> >> if ($size > 1) {
> >> header("Content-Type: application/octet-stream");
> >> header("Content-Length: $size");
> >> header("Content-Disposition: attachment; filename=$fileToBuy");
> >> header("Content-Transfer-Encoding: binary");
> >> $fh = fopen("$pathToFile", "r");
> >> if ($fh) {
> >> fpassthru($fh);
> >> } else {
> >> echo "Error: can't find file '$fileToBuy' ";
> >> }
> >> } else {
> >> echo "Sorry, but we are unable to process this file at this
> >> time.";
> >> }
> >> } else {
> >> echo "Sorry, but we can not find a file named '$fileToBuy' at
> >> '$pathToFile'. ";
> >> }} else {
>
> >> echo "Sorry, but there doesn't seem to be a file named in the URL
> >> (fileToDownload needed in url).";
>
> >> }
>
> >> Why is the file name getting truncated? Is this an HTTP header issue?
>
> > Okay, it was an HTTP header issue. I've changed the code like this:
>
> > header("Content-Type: application/octet-stream");
> > header("Content-Length: $size");
> > $fileToBuy = rawurlencode($fileToBuy);
> > header("Content-Disposition: attachment; filename=$fileToBuy");
> > header("Content-Transfer-Encoding: binary");
> > $fh = fopen("$pathToFile", "r");
> > if ($fh) {
> > fpassthru($fh);
> > } else {
> > echo "Error: can't find file '$fileToBuy' ";
> > }
>
> > Now that $fileToBuy is hit with rawurlencode before getting put into
> > the HTTP header, the file downloads correctly. I was able to download
> > a file and play it in iTunes.
>
> > However, the file downloads with a bunch of ugly %20 in the file
> > names. Can anyone think of a way I can get them out of the filenames?
>
> Sure, Use a regexp to sustitute the %20 with a space In the header part
> that defines the name,
>
> .
>
> There may be a function to do that..

Well, I tried this:

> > $fileToBuy = rawurlencode($fileToBuy);
$fileToBuy = str_replace("%20", " ",
$fileToBuy);
> > header("Content-Disposition: attachment; filename=$fileToBuy");


But that just causes the download to fail.

Any other ideas?

Re: how do I tell a browser the name of a file, for download, if the

am 16.11.2007 23:36:07 von Jake Barnes

On Oct 20, 12:01 pm, Puckdropper wrote:
> lawrence k wrote innews:1192898654.783609.289650@e34g2000pro.googlegroups.com :
>
>
>
> > On Oct 20, 6:33 am, The Natural Philosopher wrote:
> >> lawrence k wrote:
> >> > I've got a music studio for a client. Their whole studio is run
> >> > with Macintosh computers. Macintosh computers allow file names to
> >> > have open white spaces, such as "animal hospital.mp3".
>
> >> > I have a download script, so customers on the website can download
> >> > MP3s to their harddrive (rather than merely listen to it in their
> >> > browsers):
>
> >> > $fileToBuy = $_GET["fileToBuy"];
> >> > if ($fileToBuy) {
> >> > $pathToFile = "temporary_files/$fileToBuy";
> >> > if (!file_exists($pathToFile)) $pathToFile =
> >> > "site_specific_files/
> >> > $fileToBuy";
> >> > if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> >> > site_specific_files/$fileToBuy";
>
> >> > if (file_exists($pathToFile)) {
> >> > $size = @ filesize($pathToFile);
> >> > if ($size > 1) {
> >> > header("Content-Type:
> >> > application/octet-stream");
> >> > header("Content-Length: $size");
> >> > header("Content-Disposition: attachment;
> >> > filename=$fileToBuy");
> >> > header("Content-Transfer-Encoding: binary");
> >> > $pathToFile = urlencode($pathToFile);
> >> > $fh = fopen("$pathToFile", "r");
> >> > fpassthru($fh);
> >> > } else {
> >> > echo "Sorry, but we are unable to process this
> >> > file at this
> >> > time.";
> >> > }
> >> > } else {
> >> > echo "Sorry, but we can not find a file named
> >> > '$fileToBuy' at
> >> > '$pathToFile'. ";
> >> > }
> >> > } else {
> >> > echo "Sorry, but there doesn't seem to be a file named in the
> >> > URL
> >> > (fileToDownload needed in url).";
> >> > }
>
> >> > This works fine except when it encounters a file with an open space
> >> > in it, and the studio has several thousand mp3s which have open
> >> > spaces in their name.
>
> >> > If a file has an open space, the above code seems to truncate the
> >> > file name at the first open white space. Instead of "animal
> >> > hospital.mp3", the browser starts to download "animal", with no
> >> > file extension. And the download fails - instead of 6 megabytes,
> >> > only 1 kilobyte downloads.
>
> >> > Any insights?
>
> >> Yu are looking n the wrong place.
>
> >> is what happens before the first line that interests me
>
> >> $fileToBuy = $_GET["fileToBuy"];
>
> >> How is that GET variable generated, and what does
>
> >> echo $filetobuy;
>
> >> display?
>
> >> My guess is the name is truncated before it even reaches the part you
> >> showed us.
>
> > If I echo $fileToBuy to screen, I get the whole the file name. All the
> > file_exists() tests would fail, if $_GET wasn't returning the whole
> > file name.
>
> > However, I've added an if() test to see if I truly did get a file
> > handle back from fopen(). The strange thing is, this test does not
> > fail, meaning PHP was able to find the file. Check out this url:
>
> >http://www.monkeyclaus.org/download.php?fileToDownload=Diar io%20-%20Thi
> > ngs%20In%20the%20Mirror%20Appear%20Closer%20Than%20They%20Ar e%20-%2004%
> > 20-%20Coins%20Coins%20Coins.mp3
>
> > The code now looks like this:
>
> > $fileToBuy = $_GET["fileToBuy"];
> > if (!$fileToBuy) $fileToBuy = $_GET["fileToDownload"];
>
> > if ($fileToBuy) {
> > $pathToFile = "temporary_files/$fileToBuy";
> > if (!file_exists($pathToFile)) $pathToFile =
> > "site_specific_files/
> > $fileToBuy";
> > if (!file_exists($pathToFile)) $pathToFile = "../httpdocs/
> > site_specific_files/$fileToBuy";
>
> > if (file_exists($pathToFile)) {
> > $size = @ filesize($pathToFile);
> > if ($size > 1) {
> > header("Content-Type: application/octet-stream");
> > header("Content-Length: $size");
> > header("Content-Disposition: attachment;
> > filename=$fileToBuy");
> > header("Content-Transfer-Encoding: binary");
> > $fh = fopen("$pathToFile", "r");
> > if ($fh) {
> > fpassthru($fh);
> > } else {
> > echo "Error: can't find file '$fileToBuy' ";
> > }
> > } else {
> > echo "Sorry, but we are unable to process this file at
> > this
> > time.";
> > }
> > } else {
> > echo "Sorry, but we can not find a file named '$fileToBuy'
> > at
> > '$pathToFile'. ";
> > }
> > } else {
> > echo "Sorry, but there doesn't seem to be a file named in the URL
> > (fileToDownload needed in url).";
> > }
>
> > Why is the file name getting truncated? Is this an HTTP header issue?
>
> I solved a similar problem by making sure all my fields had quotation
> marks around them. Your filename field is the most likely to need them,
> if allowed in the header.


I tried putting single quotes around it, but they then show up in the
downloaded file name. I don't think quote marks are allowed in this
header.