Данные потока файлов PHP возвращаются в двоичном формате - PullRequest
0 голосов
/ 26 августа 2018

Итак, у меня есть функция, которую я НЕ МОЖУ заставить работать. Происходит то, что он возвращается с данными в двоичном формате, а не с самим файлом. Однако в двоичном файле, который я получаю, имя конкретного файла включается в строку. Данные выглядят так:

PK‹Mpt-BR/finalinport.html³)°S(ÉÈ,V¢‘ŒT…‚ü¢’ÒôÒÔâT…´Ì¼Ä ™” “I,QðT(ÏÌÉQ(-ÈÉOLQH„¨‡*Ê/B×]’X”žZ¢`£_`ÇPK.Ùô LePK‹M.Ùô Lept-BR/finalinport.htmlPKD

pt-BR - это каталог, а 'finalinport.html' - это файл, который я пытаюсь загрузить. Если я заменяю второй параметр fwrite на обычную строку, то все работает, и я получаю строку, которую я записал в файл внутри zip. Но не тогда, когда я использую Stream-> getContents (), что наводит меня на мысль, что это что-то происходит с потоком. Я не могу обернуть голову вокруг того, что может случиться. Я занимаюсь этим уже полторы недели, поэтому любые предложения будут великолепны.

public function downloadTranslations(Request $request, $id)
    {
        $target_locales = $request->input("target_locale");
        $has_source = $request->input("source");
        $client = new API(Auth::user()->access_token, ZKEnvHelper::env('API_URL', 'https://myaccount.com'));
        $document = Document::find($id);
        $job_document = JobDocument::where('document_id', $id)->first();
        $job = Job::find($job_document->job_id);

        $file = tempnam('tmp', 'zip');
        $zip = new ZipArchive();
        $zip->open($file, ZipArchive::OVERWRITE);
        $name_and_extension = explode('.', $document->name);

        if($target_locales == null){
            $target_locales = [];
            foreach ($job->target_languages as $target_language) {
                $target_locales[] = $target_language['locale'];
            }
        }

        foreach($target_locales as $target_locale){
            $translation = $client->downloadDocument($document->document_id, $target_locale);
            $filename = $name_and_extension[0] . ' (' . $target_locale . ').' . $name_and_extension[1];
            if($translation->get('message') == 'true') {
                //API brings back file in stream type
                $stream = Stream::factory($translation->get('body'));
                $newFile = tempnam(sys_get_temp_dir(), 'lingo');

                $handle = fopen($newFile, 'w');
                fwrite($handle, $stream->getContents());
                    $zip->addFile($newFile, 'eh.html');
                fclose($handle);
                }

                else if($translation->get('message') == 'false'){
                    //API brings back file contents
                    $zip->addFromString($filename, $translation->get('body'));
                }
            }
            $translation = $client->downloadDocument($document->document_id, null, null);

            $filename = $name_and_extension[0].  ' (Source).'.$name_and_extension[1];
            $zip->addFromString($filename, $translation->get('body'));
            sleep(10);
            $zip->close();

        return response()->download($file, $name_and_extension[0].'.zip')->deleteFileAfterSend(true);
}

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

1 Ответ

0 голосов
/ 26 августа 2018

Поток :: завод используется в Guzzle 5, используйте json_encode для Guzzle 6.

...