Выходной поток PHP для Coldfusion zip/pkpass

Этот проект является проектом Apple Wallet, который у меня есть, но в PHP-коде, с которым я сталкиваюсь с проблемами, не так много помощи, доступной по моему вопросу PHP, который пока не открыт, ответа пока нет, теперь я решил преобразовать в coldfusion.

Я могу сохранить файл ZIP/PKPASS в двоичном формате в BLOB. Когда я отправляю запрос PHP API GET на получение карты (двоичный zip/pkpass), он возвращает мне двоичный поток, см. Экран прикрепления ниже. введите здесь описание изображения

того же результата, которого я хочу добиться в coldfusion, когда я отправляю запрос на код API coldfusion, также прикрепленный ниже.

Почтальон: введите здесь описание изображения

Firefox: введите здесь описание изображения

Я пытаюсь преобразовать PHP-код в coldfusion (lucee). Двоичный код в базе данных, который представляет собой zip-файл, но имеет расширение «.pkpass», имя поля базы данных — «данные».

когда я запускаю код coldfusion, он выдает ошибку «Ошибка поврежденного содержимого».

PHP-код:

 $myPass = $result->fetch();

        $data = $myPass['data']; //zip/pkpass file Binary code from DB
        $nameFile = 'passbook_'.time().'.pkpass';
        file_put_contents($nameFile, $data);

        $stream = function () use ($nameFile) {
            readfile($nameFile);
        };

        return $app->stream($stream, 200, array(

            'Pragma' =>  'no-cache',
            'Cache-Control' => 'private,false',
            'Content-Transfer-Encoding' =>  'binary',
            'Content-Disposition' => 'inline; filename="'.basename($nameFile).'"',
            'Content-Type' => 'application/vnd.apple.pkpass',
            'Content-length' => filesize($nameFile),
            'Content-Disposition' => 'attachment; filename="'.$nameFile.'"',
            'Last-Modified' => gmdate('D, d M Y H:i:s T')
        ));

Код Coldfusion: НЕ РАБОТАЕТ Нужна помощь

   <cfset filename = getPass.serial_number&'_'&createUUID()&'.pkpass'>  
            <cfheader name="Pragma" value="no-cache">
            <cfheader name="Cache-Control" value="private,false">
            <cfheader name="Content-Transfer-Encoding" value="binary">
            <cfheader name="Content-Disposition" value="inline; filename=#filename#">
            <cfheader name="Content-Type" value="'application/vnd.apple.pkpass">
            <cfheader name="Content-Disposition" value="attachment; filename=#filename#">
            <cfheader name="Content-Disposition" value="#DateFormat(getPass.updated_at, "yyyy-mm-dd")#' '#TimeFormat(getPass.updated_at, 'hh:mm:ss')#">
<cfcontent type="application/x-zip-compressed" variable="#BinaryDecode(getPass.data, 'Base64')#"> <!--- Binary Data from db 'getPass.data' --->

person M.A    schedule 11.07.2017    source источник
comment
Пожалуйста, уточните not working.   -  person Dan Bracuk    schedule 11.07.2017
comment
@Dan Bracuk, я обновил свой вопрос, надеюсь, теперь он даст четкое представление о том, чего я пытаюсь достичь, спасибо.   -  person M.A    schedule 11.07.2017


Ответы (1)


Основная проблема заключается в том, что вы помещаете последнее измененное значение в заголовок «Content-Disposition». Попробуйте исправить это и очистить другие заголовки следующим образом:

<cfscript>
filename = "#getPass.serial_number#_#CreateUUID()#.pkpass";
cfheader( name="Pragma", value="no-cache" );
cfheader( name="Cache-Control", value="private,false" );
cfheader( name="Last-Modified", value="#DateFormat( getPass.updated_at, 'yyyy-mm-dd' )# #TimeFormat( getPass.updated_at, 'hh:mm:ss' )#" );
cfheader( name="Content-Transfer-Encoding", value="binary" );
cfheader( name="Content-Disposition", value="attachment; filename=#filename#" );
cfcontent( variable="#getPass.data#", type="application/vnd.apple.pkpass" );
</cfscript>
person CfSimplicity    schedule 11.07.2017
comment
@CFSimplety спасибо за быстрый ответ. Я удалил строку ‹cfheader name=Content-Disposition value=attachment; filename=#filename#› даже та же ошибка, вы можете видеть, что обновленный вопрос выглядит так, как будто я теперь могу передавать двоичные данные. когда я это делаю? <cfcontent type="application/vnd.apple.pkpass" variable="#BinaryDecode(getPass.data, 'Base64')#"> он может дать мне файл для загрузки, но в файле нет содержимого, когда я распаковываю, я что-то упускаю - person M.A; 11.07.2017
comment
Вам нужен вложенный заголовок Content-Disposition (но не встроенный — используйте тот или иной). Проблема заключается/была с третьим заголовком Content-Disposition, который должен быть заголовком Last-Modified. Вам также не нужно использовать BinaryDecode(), так как атрибут variable cfcontent ожидает двоичный код. Вы пробовали код, который я разместил? У меня это работает на Lucee, используя извлеченный большой двоичный объект из базы данных. - person CfSimplicity; 11.07.2017