В моем приложении laravel 5.4 я хочу загрузить несколько изображений выбранного продукта из базы данных, он создает несколько zip-файлов в public_path('uploads/download-images');, но не загружает файл, как я могу его загрузить.
как лучше всего это скачать?
Что я делаю неправильно ? кто-нибудь может помочь? заранее спасибо.
Ниже мой код.
public function downloads_all(Request $request)
{
$public_dir = '';
$$zipFileName = '';
$zip = '';
$product_images = DB::table('product_images')
->where('deleted_at', null)
->whereIn('product_id', explode(',', $request->ids))
->get();
if ($product_images)
{
foreach ($product_images as $value)
{
$zipFileName = 'product_' . $value->product_id . '_images.zip';
$zip = new ZipArchive;
$public_dir = public_path('uploads/download-images');
if (!is_dir($public_dir))
{
mkdir($public_dir, 0777, true);
}
if ($zip->open($public_dir . '/' . $zipFileName, ZipArchive::CREATE) === TRUE)
{
foreach ($product_images as $image)
{
$directory_path = base_path() . '/public/uploads/products/' . $image->product_id . '/images/';
$image_path = $image->image_path;
$file_name = basename($image_path);
$zip->addFile($directory_path . $file_name, $file_name);
}
$zip->close();
}
}
$files = File::files(public_path('uploads/download-images'));
$filecount = count($files);
$filetopath = array();
for ($i=0; $i < $filecount; $i++)
{
$filetopath = $public_dir . '/' . $zipFileName;
$headers = array(
'Content-Type' => 'application/octet-stream',
'Expires' => 0,
'Content-Transfer-Encoding' => 'binary',
'Content-Length' => filesize($filetopath),
'Cache-Control' => 'private, no-transform, no-store, must-revalidate',
'Content-Disposition' => 'attachment; filename = "' . $zipFileName . '"',
);
if (file_exists($filetopath))
{
return response()->download($filetopath, $zipFileName, $headers)->deleteFileAfterSend(true);
}
else
{
return ['status'=>'zip file does not exist'];
}
}
}
else
{
return back();
}
}
это js
$(document).ready(function ()
{
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
}
});
$('#download-master').on('click', function(e)
{
if ($(this).is(':checked',true))
{
$(".multiple_download").prop('checked', true);
} else {
$(".multiple_download").prop('checked',false);
}
});
$('.download-all').on('click', function(e) {
var allVals = [];
$(".multiple_download:checked").each(function() {
allVals.push($(this).attr('data-id'));
});
if (allVals.length <=0)
{
alert("Please select row to download.");
}
else
{
var join_selected_values = allVals.join(",");
$.ajax({
url: $(this).data('url'),
type: 'POST',
data:'_token = <?php echo csrf_token() ?>',
data: 'ids='+join_selected_values,
success: function (data)
{
alert('Seccussfully Downloaded');
},
error: function (data) {
alert(data.responseText);
}
});
}
});
});






$directory_path должен быть абсолютным путем, например, public_path('/uploads/products/') или $zip->addFile не может прочитать содержимое файла.
Это может работать в файлах лезвий шаблонов laravel, потому что веб-сервер будет знать, что именно означает /, но в этой ситуации / не является корневым веб-сервером. Вы можете проверить возвращаемое значение $res = $zip->addFile($directory_path.$file_name, $file_name);, если вы используете путь, начинающийся с /, вы получите false, если вы используете абсолютный путь, он работает нормально.
Просто замените $directory_path = '/public/uploads/products/'; на $directory_path = public_path('/uploads/products/');
Возможно, вам нужно проверить файл, действительно ли он существует, прежде чем добавлять его в ZipArchive, как и в предыдущем ответе.
Позвольте нам продолжить обсуждение в чате.
попробуй это
if (file_exists($filetopath))
{
return response()->download(storage_path($filetopath, $zipFileName, $headers));
}
@ShahidHussain Можете объяснить, почему он не работает? Какую ошибку выдает?
$ directory_path отлично подходит для любого другого решения