Загрузить изображение с помощью Zend - PHP header: неверный формат файла - PullRequest
1 голос
/ 21 июня 2011

Прежде всего, я знаю, что этот вопрос уже задавался, но все равно не могу его решить.Мне нужно установить ссылку для загрузки изображений (JPG).Я читал различные посты, найденные здесь и в Google, но результаты всегда одни и те же: я могу скачать файл, но это все та же ошибка.Неправильный формат JPEG.

Ошибка создания изображения JPEG (Не файл JPEG: начинается с 0x0a 0x20)

Когда я проверяю этов файле без контроллера это нормально, но скрипт в контроллере не работает.

Вот код для тестов:

 $file = '{document_root}/www/themes/default/images/common/background1.jpg';

if (file_exists($file))
{
    header('Content-type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-length: ' . filesize($file));

    readfile($file);
    exit;
}

Этот код работает в простом php-файле,Я загружаю изображение и могу открыть его.Но в моем контроллере файл не очень хороший.

Я обнаружил, что тег?> Может добавлять пробелы, но у моих контроллеров нет этого закрывающего тега.Я протестировал некоторый код с объектами Zend, найденными в разных постах, но это та же ошибка.

Я пробовал различные способы чтения файла (file_get_content (), fread () ...) с помощьютот же результат.Я предполагаю, что с моим контроллером Zend что-то не так.

Я сейчас проверяю свой файл в соответствии с этим постом: загрузка php-файла: странный заголовок http

Любая подсказка будетбыть действительно ценным.Спасибо за вашу помощь и извините за мой плохой английский.

[ПРАВКА: 21/06/2011 - 6h38] Вот код действия

public function downloadAction()
{
    $this->view->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);

    $img = $this->_getParam('img');

    // Process the file
    $config = Zend_Registry::get('config');
    $width  = $config->catalog->image->original->maxWidth;
    $height = $config->catalog->image->original->maxHeight;

    $prefix = $width . 'x' . $height . '_';
    $filename  = $prefix . $img;
    $file = Zend_Registry::get('document_root') . '/data/images/catalog/products/' . $this->_getParam('pid') .'/'. $filename;

    if (file_exists($file))
    {
        $this->getResponse()
         ->setHeader('Content-Disposition', 'attachment; filename='.$filename)
         ->setHeader('Content-Transfer-Encoding', 'binary')
         ->setHeader('Content-Length', filesize($file))
         ->setHeader('Content-type', 'image/jpeg');

        $this->getResponse()->sendHeaders();

        readfile($file);
        exit;
    }

}

Это действие не вызывается напрямую,Я проверяю, существует ли параметр в URL.Если true, то из listAction я вызываю downloadAction ().Я пытался отключить вид и макет в обоих действиях, но есть некоторые HTML-визуализации.

Ответы [ 2 ]

1 голос
/ 07 июля 2013

У меня была такая же проблема при отправке содержимого после расшифровки содержимого файла.0x0a означает новую строку.Возможно, у вас есть новая строка после тега?> В некотором включенном классе.Поместите

ob_clean(); 
flush(); 

перед

readfile($file);

примерно так:

header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-length: ' . filesize($file));
ob_clean(); 
flush();
readfile($file);
exit;

Это хорошо для меня.Надеюсь, поможет.Привет

0 голосов
/ 04 апреля 2013

Я кодирую рабочий Zend Framework:)

    public function dowloadfileAction(){
    $this->_helper->viewRenderer->setNoRender(true);
    $this->_helper->layout->disableLayout();
    if ($this->_user->isUserLogin()) { 
        $path_file = 'public/uploads/file/';
        $filename  = $this->_getParam('file');; // of course find the exact filename....
        $file = $path_file.$filename; 
        //zfdebug(mime_content_type($file)); die();
        if (file_exists($file)) {
        header('Pragma: public');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Cache-Control: private', false); // required for certain browsers 
        header('Content-Type: '.mime_content_type($file));
        header('Content-Disposition: attachment; filename="'. basename($file) . '";');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . filesize($file));
        readfile($file);
        }else{
            echo "File does not exist";
        }
    }else{
        echo "Please Login";
    }    
    exit;       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...