PHP-код для загрузки файла CSV не работает
У меня есть код ниже, где я генерирую случайные числа и пытаюсь загрузить их в виде файла CSV.
Если я попробую один фрагмент кода CSV в другом файле, он будет работать, но в этом коде он просто не будет работать. Я вижу случайные числа, но он не загружает файл CSV.
fseek($temp_memory, 0); header('Content-Type: application/csv'); header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); fpassthru($temp_memory); > for ($i = 0; $i "; > convert_to_csv($dataarray, 'data_as_csv.csv', ','); ?>
Решение
Вывод данных до отправка заголовков с header() Значит это header() звонки будут иметь нет эффект. Поэтому разумно ничего не отправлять перед заголовками.
В качестве другого ответа упоминается — второй аргумент fputcsv должен быть массив, поэтому я изменил вызов fputcsv тоже.
Если вы хотите, чтобы все значения были записаны в CSV-файл с запятой в качестве разделителя — передайте $input_array прямо к fputcsv ,
Итак, ваш код может выглядеть так:
// Option 2 - all numbers will be in // one line with `$delimiter` as separator fputcsv($temp_memory, $input_array, $delimiter); fseek($temp_memory, 0); header('Content-Type: application/csv'); header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); fpassthru($temp_memory); > for ($i = 0; $i "; > convert_to_csv($dataarray, 'data_as_csv.csv', ',');
Другие решения
На самом деле проблема в вашем convert_to_csv функция.
fputcsv ожидает, что второй параметр будет массивом, а в вашем случае — строкой. У вас есть 2 варианта в зависимости от того, что вы хотите:
1) Каждый номер в отдельной строке: просто измените fputcsv вызов функции для: fputcsv($temp_memory, [$line], $delimiter);
2) Все числа в одной строке разделены $delimiter :
function convert_to_csv($input_array, $output_file_name, $delimiter) < $temp_memory = fopen('php://memory', 'w'); fputcsv($temp_memory, $fields, $delimiter); fseek($temp_memory, 0); header('Content-Type: application/csv'); header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); fpassthru($temp_memory); >
И (я уверен, что вы уже знаете), для загрузки файла автоматически, вы не должны echo что-нибудь.
CSV не работает PHP
Проблема в том, что он создает CSV файл, но с HTML-страницей моей страницы, а не с данными, которые я хочу экспортировать из этого файла. Вот что я получил в CSV файле, когда я нажимаю кнопку экспорта.
Мой код создает файл CSV, но вместо создания файла CSV он просто создает файл CSV с содержимым страницы HTML, а не с моими данными.
Я убедился, и он не имеет никаких HTML-данных в нем, но все же он выводит HTML-данные в нем. не знаю почему.
Я скопировал код откуда-то, что работал там. Таким образом, я использовал это таким образом. Можете ли вы внести коррективы?
Ваша пользовательская страница четко выводит заголовки, прежде чем она попадет в пользовательские заголовки, которые вы определили для csv.
В самом деле? Исправить копию и пасту? Jeeeebus . Просто используйте массив $ row вместо того, чтобы объединять и разбивать ваши $ data. В противном случае вы можете захотеть очистить буфер вывода перед вызовом нового заголовка и печатью вашего CSV.
Пожалуйста, не копируйте и не вставляйте, и давайте исправим это. Попробуй что-нибудь, наткнись на ошибку, а затем спроси здесь
Вот вывод: Array ([0] => Array ([0] => 1 [de_ID] => 1 [1] => 1 [report_ID] => 1 [2] => 4788 [pallet_ID] => 4788 [3] => Apple [тип] => Apple [4] => Дандреа [consignee] => Дандреа [5] => Урон при уроне [урон] => Урон при уловке [6] => Урон по ТТ [урон_desc] => TT Damage [7] => Valdovinos [label] => Valdovinos [8] => Пламя без косточек [разновидность] => Пламя без косточек [9] => Пустые и / или отсутствующие коробки [category_code] => Пустые и / или отсутствующие коробки [10] => 2 [штук] => 2 [11] => 2 [удерживать] => 2 [12] => C [колода] => C [13] => 2014-12-08))
2 ответа
Это часть моей рабочей функции экспорта CSV:
public function exportAction() < $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); // output headers so that the file is downloaded rather than displayed header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=products.csv'); // create a file pointer connected to the output stream $output = fopen('php://output', 'w'); // output the column headings fputcsv($output, array('Product', 'Name', 'Price', 'Description')); // fetch the data $product_info = $this->product->getAll(); foreach ($product_info as $key => $product) < $row['product'] = $product->product_id; $row['name'] = $product->name; $row['price'] = $product->price; $row['description'] = $product->description; fputcsv($output, $row); > >
Обязательно сначала выводите заголовки, чтобы он не загружал HTML.
Вы не позволили пользователю загрузить загруженный файл csv, но просто измените тип содержимого текущего вывода на Content-type: text/csv . Вы создали data.csv но вы не отправили его пользователю.
Вот что-то может сработать:
header('Content-Description: File Transfer'); header("Content-type: text/csv"); header("Content-Disposition: attachment; filename=data.csv"); header("Pragma: no-cache"); header('Expires: 0'); header('Content-Length: ' . filesize('data.csv')); readfile('data.csv'); // This actually out puts your csv file exit; // This is importent that stops the current script and prevents the out put of your html part
Ещё вопросы
- 1 Разбор больших файлов XML в Android
- 1 Проблема оптимизации колонии муравьев
- 0 как я могу разрешить / usr / bin / ld: не могу найти ошибку -lconfig ++
- 1 Добавить JS вызов на Rails form_for кнопка отправки
- 0 Flash не работает на Chrome, FF, Safari, но работает на IE
- 0 Как использовать дополнительные значения в маршрутах Laravel?
- 1 Преобразование даты и времени в формат отметки времени java «2019-02-21T14: 10: 18.161 + 0000»
- 1 Установка нового сервера Glassfish на Eclipse Indigo
- 1 Передача параметров через URL в C # ASP.net
- 1 Извлечь текст из epub в Python
- 0 Упорядочить и ограничить предложения от stackoverflow не работает для меня
- 1 Autowire a Set, определенный как в Spring
- 1 ПИТОН Как сделать «ассоциативный массив»
- 0 Два объекта, кажется, имеют один и тот же адрес
- 1 Передача аргументов нескольких и различных функций в Python
- 1 Изменение размера изображения не работает на PhotoImage в tkinter
- 0 Модуль AngularJS внутри «корневого модуля»
- 0 Отладка Visual studio 2008; разрыв, когда значения пишутся
- 1 Панель прокрутки и макет панели
- 0 Скрыть родительский вид при отображении вложенных представлений
- 1 Как сбросить статическое свойство только для чтения?
- 1 Использование Moq с перегруженным методом
- 1 Получить одно значение из LiveData
- 1 получение того же типа унаследованных элементов класса из списка базовых классов с помощью linq
- 1 Использование потоков и асинхронных задач не может предотвратить ошибку ANR.
- 0 Передача значения формы скрытого поля в контроллер
- 1 Ошибка в соединении JDBC с Hive с использованием eclipse и CHD4
- 0 Области применения переменных и объектов в угловых
- 1 WebRTC — создать объект PeerConnectionFactory
- 0 Два всплывающих окна не работают должным образом
- 0 я использую ng-grid, который загружает данные из файла json, я хочу сделать кнопки редактирования и удаления, чтобы редактировать и удалять мои данные, используя угловой js?
- 1 Сервер совершил нарушение протокола. Section = ResponseStatusLine в c #
- 1 Отключить визуальную студию 2013 Intellisence ссылки. Control + щелчок мышью
- 1 Генерация пары ключей RSA на стороне клиента в приложении Google Web Toolkit через Google App Engine с библиотекой gwt-crypto
- 0 Выберите максимум, сгруппированный по годам
- 1 Использование диспетчера при создании собственного окна сообщения, однако не может прочитать возвращаемое значение
- 0 Как +1 к цифре, если первый десятичный знак больше или равен 5?
- 0 jQuery animate () меняет цвет CSS-треугольника — почему это не работает?
- 0 Сложный SQL-запрос с переменными
- 1 Android — уведомление переднего плана отменяется при удалении приложения из последних приложений
- 0 МОЯ SMTP-почта продолжает поступать как нежелательная
- 0 Как включить / отключить кнопку, когда флажок установлен в таблице с помощью angularjs?
- 1 Запустите одно приложение метро из другого приложения метро Windows 8
- 0 якорные теги inline-block неуместны, может кто-нибудь сказать мне, почему?
- 0 Подсчет всех предыдущих вхождений класса в DOM
- 0 MySQL запрос и реляционная таблица
- 0 использовать barcodeScanner в кордове (с angularjs)
- 0 XML-файл загрузки с PHP
- 0 Почему $ _POST не распознает определенные загруженные файлы?
PHP экспорт CSV UTF-8 с спецификацией не работает
Я несколько дней цеплялся за экспорт UTF-8 CSV с китайскими символами, который показывает искаженный текст в Windows Excel. Я использую PHP и уже добавил байт байта BOM и пробовал кодировку, но не повезло. Они отлично работают на Notepad++, Google Spreadsheet и даже на Mac Numbers. Но не в Excel, который является требованием клиента. При открытии с помощью Notepad++ кодировка отображается как UTF-8. Если я изменил его на UTF-8 вручную и сохранил, файл отлично откроется в Excel. Кажется, что байтовая метка спецификации не сохраняется на выходе, поскольку Notepad++ всегда обнаруживает ее как UTF-8 без спецификации. Кроме того, CSV не сохраняется на сервере. Данные извлекаются из БД и затем экспортируются напрямую. Вот мои коды:
// Setup headers header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header("Content-type: text/csv"); header("Content-disposition: filename=".$filename.".csv"); header("Pragma: no-cache"); // First Method $fp = fopen('php://output', 'w'); // Add BOM to fix UTF-8 in Excel, but doesn't work fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF) ); if ($fp) < fputcsv($fp, array("Header"), ","); fputcsv($fp, array($string_with_chinese_chars), ","); >fclose($fp); exit(); // Second Method $csv = ""; $sep = ","; $newline = "\n"; // Also tried with PHP_EOL $csv .= "Header"; $csv .= $newline; $csv .= $string_with_chinese_chars; $csv .= $newline; // Tried all the below ways but doesn't work. // Method 2.1 print chr(255) . chr(254) . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8'); // Method 2.2 print chr(239) . chr(187) . chr(191) . $csv; // Method 2.3 print chr(0xEF).chr(0xBB).chr(0xBF); print $newline; print $csv;
Можете ли вы открыть файл в шестнадцатеричном редакторе до и после сохранения в Notepad ++ и посмотреть, в чем разница? А может даже добавить шестнадцатеричный дамп файла в свой вопрос, если он достаточно короткий?
Обновление: загруженный файл HEX начинается с 0A EF BB BF. В то время как файл после сохранения в Notepad ++ начинается с EF BB BF 0A EF BB BF. 0А выглядит новой линией. Каким-то образом это, кажется, добавляется в начале файла, хотя в кодах этого не было. Это сервер общего хостинга, и у меня нет доступа к php.ini.