Файл сохранения ответа на сообщение HTTP-клиента Laravel

#php #laravel #http

Вопрос:

Отправляет запрос post другому api внутри контроллера Laravel. Он возвращает файл .pdf в качестве ответа. Я хочу сохранить этот файл в хранилище. Я получаю исключение FileNotFound.

Вот код

 public function cvToPDF(Request $request)
{
        $response = Http::withHeaders(['Content-Type' => 'application/pdf'])
            ->withToken(Request()->bearerToken())
            ->post('http://some-endpoint', $request->all());
        
        Storage::disk('s3')->putFile('drive/files', $response);

        return $response;
}
 

возврат $ответ работает на стороне клиента. Я могу загрузить PDF-файл с этой конечной точкой. Но Storage::диск вызывает исключение.

Комментарии:

1. PutFile принимает IlluminateHttpFile либо IlluminateHttpUploadedFile экземпляр или в качестве второго аргумента , убедитесь, что это так, вместо загрузки вы должны хранить на диске, а затем указать путь во втором аргументе

2. какое исключение это вызывает?

3. @Прадип, я знаю. И я пытаюсь преобразовать этот ответ в экземпляр файла IlluminateHttp. Вы можете мне в этом помочь? Я пробовал $file = новый файл($response); Но не сработало.

4. Ошибка: Вызов неопределенного метода ОсветитьПоддержкаФасадыФайл::hashName()

Ответ №1:

Потому что вы пытаетесь сохранить ответ, а не файл.

Обходной путь в методе sink () — это МОЖЕТ сработать.

 public function cvToPDF(Request $request)
{
    $tempName = tempnam(sys_get_temp_dir(), 'response').'.pdf';
    $response = Http::sink($tempName)
        ->withHeaders(['Content-Type' => 'application/pdf'])
        ->withToken(Request()->bearerToken())
        ->post('http://some-endpoint', $request->all());
    Storage::disk('s3')->putFile('drive/files', new File($tempName));
    return $response;
}
 

Ответ №2:

Вместо загрузки вы должны сохранить pdf в каталоге, после чего использовать что-то вроде этого :

 Storage::disk('s3')->putFile('drive/files', new File('/path/to/pdf'));
 

Для получения дополнительной информации : https://laravel.com/docs/8.x/filesystem#storing-files

Комментарии:

1. $tmp_path = sys_get_temp_dir(); $tmp_name = $tmp_path . ‘/’ . auth(‘api’)->пользователь()->>идентификатор.’. pdf’; содержимое файла($tmp_name, $ответ); Хранилище::диск(«s3»)->>>Файл(«диск/файлы», новый файл($ответ)); добавлены эти строки после запроса. Но происходит та же ошибка.

2. Но главный вопрос — как сохранить файл из ответа 🙂