PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Thursday, December 30, 2021

[FIXED] Yii2 - download corrupted file

 December 30, 2021     php, xlsx, yii, yii2, yii2-advanced-app     No comments   

Issue

I am working on existing products and i am trying to resolve problem with downloading xlsx file. When i download file through file manager, file is allright. But when i download file through Yii app, the file is corrupted.

Here is my code

public function actionCallLog($hash, $filename)
    {
        var_dump(
            $hash, $filename
        );

        ignore_user_abort(true);
        set_time_limit(0);
        

        $path = "/var/www/html/uploads/call_log/".$hash.'/';

        $dl_file= basename($filename).'.xlsx';
        if (!file_exists($path.$dl_file)) {
            $dl_file= basename($filename).'.csv';
        }
        $fullPath = $path.$dl_file;

        if ($fd = fopen ($fullPath, "r"))
        {

            $fsize = filesize($fullPath);
            $path_parts = pathinfo($fullPath);
            $ext = strtolower($path_parts["extension"]);
            switch ($ext)
            {
                case "xlsx":
                header('Content-Description: File Transfer');
                header("Content-type: application/xlsx");
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
                break;
                case "csv":
                header('Content-Description: File Transfer');
                header("Content-type: application/csv");
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
                break;
                // add more headers for other content types here
                default;
                header('Content-Description: File Transfer');
                header("Content-type: application/octet-stream");
                header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
                break;
            }
            header("Content-length: $fsize");
            header("Cache-control: private");
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Expires: 0');
            header('Pragma: public');
            while(!feof($fd))
            {
                $buffer = fread($fd, 2048);
                echo $buffer;
            }
        }
        fclose ($fd);
        exit;
    }

Does anybody know where can be the problem?
Thanks


Solution

Try turning off all the header instructions (and also the "echo $buffer;" as that might be a lot on screen) and see if any warnings or errors is printed on screen when opening the url for the file download.

If the corrupted file has a size, your code might actually give a warning or generate other output which will become part of the file because it is also echo'ed. Obviously that extra plain text output by your code would turn your correct xlsx into a corrupt file. You might be able to get that text by opening your corrupted file in a text-editor as it would show in there in plain text (probably at the start).



Answered By - Rik
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home
View mobile version

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing