问题描述:用laravel写了一个上传csv文件到s3的功能,在本地运行正常,但是到了测试环境却无法将上传成功后返回的s3链接直接下载,而是在浏览器中直接显示csv文件内容:
原代码:
Storage::disk('s3FileUpload')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), 'public');
改动后代码:(增加ContentType=> binary/octet-stream)
Storage::disk('s3FileUpload')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), [
'visibility' => 'public',
'ContentType' => 'binary/octet-stream'
]);
完整代码:
$temp = tmpfile();
$queryList = $request->input();
$ids = $request->get('ids', []);
//检索数据
$products = Product::select('test')->when(
!empty($ids), function ($query) use ($ids) {
return $query->whereIn('id', $ids);
}, function ($query) use ($queryList) {
if (empty($queryList)) {
return $query->whereRaw('1=0');
}
return $query->applyFilter($queryList);
})->orderBy('id', 'desc')->get()->toArray();
if(empty($products)){
return $this->responseError('products list is empty');
}
$productsExportList = $this->getProductsExportList($products);
foreach ($productsExportList as $data) {
fputcsv($temp, $data);
}
$path = 'labels/'.date("Y/m/d/"). uniqid('', true) . '.csv';
Storage::disk('s3')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), [
'visibility' => 'public',
'ContentType' => 'binary/octet-stream'
]);
fclose($temp);
$url = Storage::disk('s3')->url($path);
return $this->responseSuccess(["url" => $url], "success");