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