Difference between #48 and #49 of
Yii v2 snippet guide II

Revision #49 has been created by rackycz on Oct 11, 2020, 5:33:50 PM with the memo:

base64 stream download
« previous (#48) next (#50) »

Changes

Title unchanged

Yii v2 snippet guide II

Category unchanged

Tutorials

Yii version unchanged

2.0

Tags unchanged

tutorial,beginner,yii2,snippets

Content changed

[...]
if (trim($this->company_name)!=='') {
$query->andFilterWhere(['like', 'table.column', $this->company_name]);
}
}
```

 
 
**Sending data as file to the browser**
 
---
 
 
In my tutorial for Yii v1 I presented following way how to send headers manually and then call exit(). But calling exit() or die() is not a good idea so I discovered a better way in Yii v2.
 
See chapter [Secured (secret) file download](https://www.yiiframework.com/wiki/462/yii-for-beginners-2)
 
 
Motivation: Sometimes you receive a PDF file encoded into a string using base64. For example a label with barcodes from FedEx, DPD or other delivery companies and your task is to show the label to users. 
 
 
For me workes this algorithm:
 
 
```php
 
$pdfBase64 = 'JVBERi0xLjQ ... Y0CiUlRU9GCg==';
 
 
// First I create a fictive stream in a temporary file
 
// Read more about PHP wrappers: 
 
// https://www.php.net/manual/en/wrappers.php.php 
 
$stream = fopen('php://temp','r+');
 
 
// Decoded base64 is written into the stream
 
fwrite($stream, base64_decode($pdfBase64));
 
 
// And the stream is rewound back to the start so others can read it
 
rewind($stream);
 
 
// This row sets "Content-Type" header to none. Below I set it manually do application/pdf.
 
Yii::$app->response->format = Yii::$app->response::FORMAT_RAW;
 
Yii::$app->response->headers->set('Content-Type', 'application/pdf');
 
      
 
// This row will download the file. If you do not use the line, the file will be displayed in the browser.
 
// Details here:
 
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Downloads
 
//Yii::$app->response->headers->set('Content-Disposition','attachment; filename="hello.pdf"'); 
 
    
 
// Here is used the temporary stream
 
Yii::$app->response->stream = $stream;
 
 
// You can call following line, but you don't have to. Method send() is called automatically when current action ends:
 
// Details here:
 
// https://www.yiiframework.com/doc/api/2.0/yii-web-response#sendContentAsFile()-detail
 
// return Yii::$app->response->send(); 
 
 
Note: You can add more headers if you need. Check my previous article (linked above).
 
 
```
4 0
3 followers
Viewed: 75 394 times
Version: 2.0
Category: Tutorials
Written by: rackycz
Last updated by: rackycz
Created on: Aug 26, 2020
Last updated: 3 years ago
Update Article

Revisions

View all history