laravel 响应流下载 returns 空文件
laravel response stream download returns empty file
我有一个控制器方法可以接收用户的下载请求,使用请求的 body 参数调用 REST API 端点。
API,在return,发送一个文件。
我正在使用 Guzzle 来发出 API 请求和 laravel 版本 5.4
。
$response->getBody()->getContents();
的内容如下:
"""
request_id\ts_sku\tr_product_url\thuman_verdict\n
199\tSG-948\thttps://www.amazon.com/gp/offer-listing/B076CP7J4P?condition=new\tMatch\n
199\tZIB-601\thttps://www.amazon.com/gp/offer-listing/B07D9PN39C?condition=new\tMatch\n
199\tRCM-LG526\thttps://www.amazon.com/gp/offer-listing/B07FDJ3W7P?condition=new\tMatch\n
199\tGSI-335\thttps://www.amazon.com/gp/offer-listing/B07GNX1VSG?condition=new\tMatch\n
199\tZIB-489\thttps://www.amazon.com/gp/offer-listing/B07D9RCGXM?condition=new\tMatch\n
"""
此外,从 API 收到的 header 响应是:
Content-Type : ('text/tab-separated-values', none)
Content-Disposition : attachment; filename=/path/to/file1.tsv
我正在尝试在我的控制器中接收此文件,并且 return 响应作为流下载到用户的浏览器。
控制器方法如下:
$client = new Client(["base_uri" => $this->apiBaseUrl]);
$url = 'download/filterdownload/';
try {
$response = $client->request('POST', $url, ['headers'=>['Content-Type' => 'application/json'], 'body'=>json_encode($filterArr)]);
# $resArr = json_decode($response, true);
} catch (\Exception $e) {
return redirect()->back()->with('error', $e->getMessage());
}
if(!empty($resArr) && array_key_exists('response', $resArr))
return redirect()->back()->with('error', $resArr['response']);
# return response
$file = $response->getBody()->getContents();
$file_name = $filterArr['client_name'].'_'.Carbon::now()->toDateString().'.tsv';
$headers = [
'Content-Disposition' => 'attachment; filename='. $file_name. ';'
];
return response()->stream(function () {
$file;
}, 200, $headers);
这会下载一个文件,但该文件是空的。
也许有帮助:
# return response
$file = $response->getBody()->getContents();
$file_name = $filterArr['client_name'].'_'.Carbon::now()->toDateString().'.tsv';
$headers = [
'Content-Disposition' => 'attachment; filename='. $file_name. ';'
];
return response()->stream(function () use ($file) { <-- edit
$file;
}, 200, $headers);
试试这个
$streamFileData = $response->getBody()->getContents();
$fileName = "test.pdf";
$headers = [
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename=' . $fileName,
];
$response = response( $streamFileData, 200, $headers );
return $response;
我有一个控制器方法可以接收用户的下载请求,使用请求的 body 参数调用 REST API 端点。
API,在return,发送一个文件。
我正在使用 Guzzle 来发出 API 请求和 laravel 版本 5.4
。
$response->getBody()->getContents();
的内容如下:
"""
request_id\ts_sku\tr_product_url\thuman_verdict\n
199\tSG-948\thttps://www.amazon.com/gp/offer-listing/B076CP7J4P?condition=new\tMatch\n
199\tZIB-601\thttps://www.amazon.com/gp/offer-listing/B07D9PN39C?condition=new\tMatch\n
199\tRCM-LG526\thttps://www.amazon.com/gp/offer-listing/B07FDJ3W7P?condition=new\tMatch\n
199\tGSI-335\thttps://www.amazon.com/gp/offer-listing/B07GNX1VSG?condition=new\tMatch\n
199\tZIB-489\thttps://www.amazon.com/gp/offer-listing/B07D9RCGXM?condition=new\tMatch\n
"""
此外,从 API 收到的 header 响应是:
Content-Type : ('text/tab-separated-values', none)
Content-Disposition : attachment; filename=/path/to/file1.tsv
我正在尝试在我的控制器中接收此文件,并且 return 响应作为流下载到用户的浏览器。
控制器方法如下:
$client = new Client(["base_uri" => $this->apiBaseUrl]);
$url = 'download/filterdownload/';
try {
$response = $client->request('POST', $url, ['headers'=>['Content-Type' => 'application/json'], 'body'=>json_encode($filterArr)]);
# $resArr = json_decode($response, true);
} catch (\Exception $e) {
return redirect()->back()->with('error', $e->getMessage());
}
if(!empty($resArr) && array_key_exists('response', $resArr))
return redirect()->back()->with('error', $resArr['response']);
# return response
$file = $response->getBody()->getContents();
$file_name = $filterArr['client_name'].'_'.Carbon::now()->toDateString().'.tsv';
$headers = [
'Content-Disposition' => 'attachment; filename='. $file_name. ';'
];
return response()->stream(function () {
$file;
}, 200, $headers);
这会下载一个文件,但该文件是空的。
也许有帮助:
# return response
$file = $response->getBody()->getContents();
$file_name = $filterArr['client_name'].'_'.Carbon::now()->toDateString().'.tsv';
$headers = [
'Content-Disposition' => 'attachment; filename='. $file_name. ';'
];
return response()->stream(function () use ($file) { <-- edit
$file;
}, 200, $headers);
试试这个
$streamFileData = $response->getBody()->getContents();
$fileName = "test.pdf";
$headers = [
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename=' . $fileName,
];
$response = response( $streamFileData, 200, $headers );
return $response;