Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Problem with SS_HTTPRequest::send_file

Go to End

2 Posts   1402 Views


Community Member, 165 Posts

19 January 2012 at 11:57pm

I'm having a problem with SS_HTTPRequest::send_file

I am trying to do the following:

Customers can buy .mp3 files. When they buy one, they receive a code or password and a link via email.

When the customers click on the link, the system checks whether the code is valid, works out what file to serve and, in theory, serves it. I don't want to have a direct link to the assets folder.

So, I have this in my .config.php to send everything to a class where I can check everything

Director::addRules(100, array(
'SecureFiles//$Action/$ID' => 'SendSecureFile'

and this in the .htaccess in my assets folder

# Secure files
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)
RewriteRule ^assets/(.*)$ SecureFiles/%1 [L]

Finally I have a SendSecureFile class that reads the product id and the associated password/code


class SendSecureFile extends Controller {

  function index() {

    //pw = password
    // pr = product

    if(!isset($_GET["pw"]) || ($_GET["pw"]=="") || !isset($_GET["pr"]) || ($_GET["pr"]=="")){
      return ErrorPage::response_for(400);

      $sqlQuery = new SQLQuery();
      $sqlQuery->select = array("f.Filename", "f.Name", "FileNameID");
      $sqlQuery->from = array("
	Product p
	LEFT JOIN Product_OrderItem pi ON (p.ID = pi.ProductID)
	LEFT JOIN File f ON (FileNameID = f.ID)
      $sqlQuery->where = array("pi.ProductPassword = '" . $_GET["pw"] . "' AND p.ID = " . $_GET["pr"]);

      $result = $sqlQuery->execute();

      if($sqlQuery->unlimitedRowCount() == 0){
          //no matches
	  return ErrorPage::response_for(404);

      foreach($result as $row) {
        //should only be one, really...
	$fileName = $row['Filename'];
	$Name = $row['Name'];

      $fullPath = Director::BaseFolder() . "/assets/Uploads/" . $Name;
      if (!file_exists($fullPath) || is_dir($fullPath) ) {
          // File really not found - must be a discrepancy with the database
          Debug::show("$fullPath not found");
	  return ErrorPage::response_for(500); //set to something better later.

       // Send file
	return SS_HTTPRequest::send_file(file_get_contents(Director::absoluteBaseURL() . $fileName), Director::absoluteBaseURL() . $fileName);



And here is my problem:

The file doesn't get sent, instead, I get the file content on my screen, which freezes the browser.

What am I doing wrong?

I want to get the usual dialog where you are asked if you want to save the file or play it.

Thanks in advance.


49 Posts

22 September 2012 at 8:49am

Kind of stuck at the same place as you, did you solve this problem?