Php zip архив пуст
Мне нужна небольшая помощь. Я намеревался создать 2 csv-файла на PHP и заставить браузер загрузить их. Это произойдет, когда пользователи нажмут кнопку. Однако я обнаружил, что для каждого http-запроса разрешена только 1 загрузка файла. Я наткнулся на этот stackoverflow пост Решение создает в памяти 3 csv-файла, добавляет их в zip-файл и загружает в браузер клиента .
Я попробовал решение, помеченное как правильное, но оно не сработало. Был загружен zip-файл, но он пуст.
Что я уже пробовал:
// some data to be used in the csv files $headers = array('id', 'name', 'age', 'species'); $records = array( array('1', 'gise', '4', 'cat'), array('2', 'hek2mgl', '36', 'human') ); // create your zip file $zipname = 'file.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); // loop to create 3 csv files for ($i = 0; $i < 3; $i++) { // create a temporary file $fd = fopen('php://temp/maxmemory:1048576', 'w'); if (false === $fd) { die('Failed to create temporary file'); } // write the data to csv fputcsv($fd, $headers); foreach($records as $record) { fputcsv($fd, $record); } // return to the start of the stream rewind($fd); // add the in-memory file to the archive, giving a name $zip->addFromString('file-'.$i.'.csv', stream_get_contents($fd) ); //close the file fclose($fd); } // close the archive $zip->close(); header('Content-Type: application/zip'); header('Content-disposition: attachment; filename='.$zipname); header('Content-Length: ' . filesize($zipname)); readfile($zipname); // remove the zip archive // you could also use the temp file method above for this. unlink($zipname);
Richard MacCutchan
Вам нужно закрыть файл .csv, когда вы закончите его писать, чтобы получить содержимое в zip-архив.
Member 12541933
Я полагаю, что да ?
fclose($fd);
Или я делаю это неправильно ?