emersonthis
emersonthis

Reputation: 33378

CakePHP: How to set file name when using $this->response->file()

We're sending a zip file download as a response like this:

    $this->response->file( "/export/stuff.zip", array('downlaod'=>true, 'name'=>"stuff.zip") );
    return $this->response;

This works fine, BUT the file is always named export.zip. Our name option does not seem to have any effect. We've also tried without the .zip extension. This is confusing because the name options is shown here, in the docs.

What are we doing wrong?

Update: We figured out that the seemingly arbitrary name "export" is being copied from the name of the controller action. We changed the method name to "admin_exportt" and then we get exportt.zip every time. This isn't documented anywhere that I've seen.

We found where the name is handled in the source code (/lib/Cake/Nework/CakeResponse.php:1254) and it appears that it should either use the original file name, or whatever is specified in the name options:

        if (is_null($options['name'])) {
            $name = $file->name;
        } else {
            $name = $options['name'];
        }

Upvotes: 2

Views: 2017

Answers (1)

emersonthis
emersonthis

Reputation: 33378

Ugh! We figured out what was wrong...

Notice the word downlaod in the first line of my code above? That's the culprit. Apparently that bad option was causing the entire array to get ignored. I'm not sure if this will help anyone in the future, but I guess I'll leave it up as a reminder that CakePHP options work that way (at lease in this context).

PS: Whenever you're stuck, go take a walk and come back!

Upvotes: 3

Related Questions