PHP文件流数据以二进制形式返回

时间:2018-08-26 00:19:06

标签: php file networking stream

所以我有一个我无法使用的功能。发生的是它返回的是二进制数据而不是实际文件的数据。但是,在返回的二进制文件中,特定文件的名称包含在字符串中。数据如下:

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 :(得分:0)

Stream :: factory 用于Guzzle 5,将json_encode用于Guzzle 6。