:confused::confused:
I have been on the quest to find a php script that can serve files for downloads and limit the speed at which the file is transfered to the user. I want a faster download speed for registered members and a slower speed for guests.
The only other thing I can think of is using the header() function to force a download for the requested file type and stream the file to the user's browser. Then using sleep() or usleep() on a loop until the download completes.
Anyone have any suggestions or ideas?
~Chipgraphics
12 26798
Here is a snippet i found on php.net. -
[font=Courier New]<?php
-
-
$file = "test.mp3"; [/font][font=Courier New]// file to be send to the client
-
$speed = 8.5; [/font][font=Courier New]// 8,5 kb/s download rate limit
-
-
if(file_exists($file) && is_file($file[/font][font=Courier New])) {
-
-
header("Cache-control: private"[/font][font=Courier New]);
-
header("Content-Type: application/octet-stream"[/font][font=Courier New]);
-
header("Content-Length: ".filesize($file[/font][font=Courier New]));
-
header("Content-Disposition: filename=$file" . "%20"[/font][font=Courier New]);
-
-
flush[/font][font=Courier New]();
-
-
$fd = fopen($file, "r"[/font][font=Courier New]);
-
while(!feof($fd[/font][font=Courier New])) {
-
echo fread($fd, round($speed*1024[/font][font=Courier New]));
-
flush[/font][font=Courier New]();
-
sleep(1[/font][font=Courier New]);
-
}
-
fclose ($fd[/font][font=Courier New]);
-
-
}
-
?> [/font]
-
Link to page and exact code.
With the constant change of protocols and programming yada yada. I read over what you had suggested and combined a couple of the concepts into one package deal. And it worked on the first try ! :D So, thank you for pointing me in the right direction ! I'll list my source code below.
Here's a function to use PHP to control download bandwith speed: All original code I borrowed from PHP's online documentation found HERE. -
<?php
-
function send_file($file, $speed = 100) {
-
-
//First, see if the file exists
-
if (!is_file($file)) {
-
die("<b>404 File not found!</b>");
-
}
-
//Gather relevent info about file
-
$filename = basename($file);
-
$file_extension = strtolower(substr(strrchr($filename,"."),1));
-
// This will set the Content-Type to the appropriate setting for the file
-
switch( $file_extension ) {
-
case "exe":
-
$ctype="application/octet-stream";
-
break;
-
case "zip":
-
$ctype="application/zip";
-
break;
-
case "mp3":
-
$ctype="audio/mpeg";
-
break;
-
case "mpg":
-
$ctype="video/mpeg";
-
break;
-
case "avi":
-
$ctype="video/x-msvideo";
-
break;
-
-
// The following are for extensions that shouldn't be downloaded
-
// (sensitive stuff, like php files)
-
case "php":
-
case "htm":
-
case "html":
-
case "txt":
-
die("<b>Cannot be used for ". $file_extension ." files!</b>");
-
break;
-
default:
-
$ctype="application/force-download";
-
}
-
-
// Begin writing headers
-
header("Cache-Control:");
-
header("Cache-Control: public");
-
header("Content-Type: $ctype");
-
-
$filespaces = str_replace("_", " ", $filename);
-
// if your filename contains underscores, replace them with spaces
-
-
$header='Content-Disposition: attachment; filename='.$filespaces;
-
header($header);
-
header("Accept-Ranges: bytes");
-
-
$size = filesize($file);
-
// check if http_range is sent by browser (or download manager)
-
if(isset($_SERVER['HTTP_RANGE'])) {
-
// if yes, download missing part
-
-
$seek_range = substr($_SERVER['HTTP_RANGE'] , 6);
-
$range = explode( '-', $seek_range);
-
if($range[0] > 0) { $seek_start = intval($range[0]); }
-
if($range[1] > 0) { $seek_end = intval($range[1]); }
-
-
header("HTTP/1.1 206 Partial Content");
-
header("Content-Length: " . ($seek_end - $seek_start + 1));
-
header("Content-Range: bytes $seek_start-$seek_end/$size");
-
} else {
-
header("Content-Range: bytes 0-$seek_end/$size");
-
header("Content-Length: $size");
-
}
-
//open the file
-
$fp = fopen("$file","rb");
-
-
//seek to start of missing part
-
fseek($fp,$seek_start);
-
-
//start buffered download
-
while(!feof($fp)) {
-
//reset time limit for big files
-
set_time_limit(0);
-
print(fread($fp,1024*$speed));
-
flush();
-
sleep(1);
-
}
-
fclose($fp);
-
exit;
-
}
-
?>
I hope that helps someone out too. Thanks again for pointing me in the right direction !!
~Chipgraphics
Hey, congrats on getting the results you were looking for.
Thanks for posting the code for people to learn from, that's what this forum is all about.
~KUB
I used that script from php.net but i have a problem. When i click on download it starts download, but on ~600kB it stops and dont download....
can abybody explain me thit??
Download issues from their server. Maybe wait for a few hrs and try again.
Download issues from their server. Maybe wait for a few hrs and try again.
it is localhost.....
can it be some option of apache ???
in my webhosting i tried to download 20 MB and it was OK....
@Flegma
it's because php stops your script (your script will timeout).. to avoid it, copy following code in the top of your script:
set_time_limit(99999999);
I'm pretty new to PHP. Where in this file would I include the name of the file that I want the user to download or is there a different way to set what file to use this script for? Thanks in advance!
the file name is the function’s first parameter.
My fault. I meant in chipgraphics code.
I would assume I would input the filename somewhere in this line: - $filename = basename($file);
If not, where?
Thanks in advance.
- function send_file($file, $speed = 100) {
as can be deduced from line 5 to 9.
This code works on my station only if I comment sleep statement! Otherwise browser waiting for file but download doesn't starts. Why?
System: Debian squeeze 2.6.31.6 / Apache 2.2.14-3 / PHP 5.2.1
Sign in to post your reply or Sign up for a free account.
Similar topics
by: D. Alvarado |
last post by:
Hello, I would like to design a page that measures the user's download
connection. Does anyone have an example link or script that might aid
me in this task?
Thanks, - Dave
|
by: tjfdownsouth |
last post by:
I have a site that allows a person to log in and get a list of files to
download for them. If the file size is under 65MB then everything is fine,
they click the download button and the save box...
|
by: - |
last post by:
I have only 1m records in my database running on a laptop of speed
1.6GHz, memory 512MB ram, and Toshiba MK8032GAX hard disk.
I use 'LIMIT x,10' for the query to utilise record paging.
When the...
|
by: keerthyragavendran |
last post by:
hi
i'm downloading a single file using multiple threads...
how can i specify a particular range of bytes alone from a single
large file... for example say if i need only bytes ranging from...
|
by: falloutphil |
last post by:
Hi,
First of all sorry for the double post - this is on the Python page too, but as far as I can see this is an Apache issue now. Mods - feel free to delete the similar titled posts from me on...
|
by: toka |
last post by:
Hello,
I use HttpWebRequest/HttpWebResponse to retrieve a file from weberver. I retrieve it as a Stream and write to file. But this simple method uses all available network bandwidth.
How can I...
|
by: =?Utf-8?B?Z3JlYXRiYXJyaWVyODY=?= |
last post by:
Hi,
I know there isn't a specific event property for the download speed, but can
anyone tell me how to find it? I'm not sure how to write the code.
Thanks,
Jason
|
by: Nad |
last post by:
I have a very large site with valuable information.
Is there any way to prevent downloading a large number
of articles. Some people want to download the entire site.
Any hints or pointers would...
|
by: raids51 |
last post by:
Hello, i have a program that downloads a file using the httpwebrequest/response, and it usually works, but sometimes it will freeze at a random part of the download without an error.
here is the...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
| |