2017-04-10 2 views
1

저는 Guara with Laravel을 사용하는 데 매우 익숙합니다. 나는 현재 프론트 엔드와 별도의 REST API 간의 통신에만 사용하고있다.Laravel을 사용하여 API에서 단어 문서를 다운로드하는 방법

내 API에서 파일을 다운로드하려고하는데 어떻게해야할지 모르겠다. 파일에 대한 경로를 지정하고 직접 다운로드 할 수는 있지만 브라우저에서 스트리밍하거나 볼 수 있기를 원하므로 사용자는 단지 다운로드하는 대신 워드 문서를 볼 수 있습니다. > 다운로드 - 나는 사용하여 파일을 반환

$resp = $client->request('GET', env('API_BASE_URL').'/project/'.$id. '/download-report', [ 'headers' => [ 'Authorization' => 'Bearer '. session()->get('api_token') ] ]); 

내 API를 백엔드에서 :

현재 I는 API 프로젝트 (API 호출을 수행하는 백엔드) 프런트 엔드 프로젝트에서 GET 요청을 전송하고 있습니다() 함수를 호출합니다.

return response()->download($report->getPath()); 

누군가이 상황에 접근하는 가장 좋은 방법을 설명 할 수 있습니까?

두 가지 문제에 대한 해결책은 멋지거나 다운로드하거나 실제로 단어 문서의 내용을 보는 것입니다.

미리 감사드립니다.

답변

0

우선 웹 서버에서 파일을 제공하는 것이 더 좋습니다 ("더 똑똑한"작업을 위해 PHP는 그대로 두십시오). 그 뒤에있는 아이디어는 실제 파일을 숨기고 만료 시간 제한이있는 "안전한"링크를 생성하는 것입니다.

(서버에 따라 다르지만 nginx, Apache 또는 다른 것) 몇 가지 방법이 있습니다. A good example for nginx을 사용하면 API에서 이러한 링크를 생성하고 프론트 엔드를 통해 최종 사용자에게 전송할 수 있습니다.

PHP로 수행하는 것을 선호한다면, 임시 파일에 파일을 다운로드 한 다음 response()->download()을 사용하여 프론트 엔드에 해당 헤더 (Content-Type)를 보내면됩니다.

$tmpFile = tempnam(sys_get_temp_dir(), 'reports_'); 

$resp = $client->request('GET', '...', [ 
    // ... your options ... 
    'sink' => $tmpFile, 
]); 

response()->download(
    $tmpFile, 
    null, 
    [ 
     'Content-Type' => $resp->getHeader('Content-Type')[0] 
    ] 
)->deleteFileAfterSend(true); 
+0

답장을 보내 주셔서 감사합니다. 나는 현재 base64 데이터로 서비스하고 있으며 다른 쪽에서 다시 디코딩하고있다. 그런 다음 임시 파일에 저장하고 다운로드하십시오. 나는 이것이 당신이하는 일과 똑같은 일이라고 생각해. 그렇지? –

+0

대부분 같지만 파일이 너무 큰 경우 메모리 제한을 초과하여 충돌 할 수 있습니다. 'sink' 옵션을 사용하면 파일에 바이트를 직접 (사용자가받을 때) 씁니다. 따라서 메모리 오버 플로우가 발생하지 않습니다. –

+0

그래서 내가 디자인을 단순화하고'싱크대 '를 사용할 수 있도록, (백엔드와 프론트 엔드 사이에서) 앱 내부에서 base64 인코딩/디코딩을 건너 뛰는 조언이 필요하다. –

관련 문제