У меня есть базовый c веб-сайт, использующий PHP и PostgreSQL в качестве серверной части в Heroku. Мне нужно, чтобы пользователи загружали CSV в таблицу в Postgres. Поскольку Heroku имеет временную файловую систему (не может создавать или изменять файлы на сервере), я пытаюсь найти работоспособный способ достижения этой цели.
Я пробовал различные методы (COPY, / copy, pg_put_line ( ), pq_query (), pg_prepare () / pg_execute () и др. c.) без успеха. Моя текущая итерация:
- HTML тип ввода файла на веб-странице для пользователя, чтобы просмотреть / выбрать CSV-файл.
- Javascript синтаксический анализ массива массивов. Внешний массив строк из CSV, каждая из которых содержит массив значений для этой строки. Затем AJAX вызов PHP, передача массива массивов в качестве параметра.
- PHP с использованием pg_copy_from () для вставки данных в Postgres
Все это приводит к
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
и
PHP Warning: pg_copy_from(): Copy command failed: ERROR: missing data for column "sku"
CONTEXT: COPY product, line 1: "Array" in /app/upload.php on line 12
Нет ничего уникального в таблице или CSV. Поле «SKU», указанное в сообщении, является вторым столбцом, поэтому оно, кажется, срабатывает немедленно. Следует отметить, что запуск выгрузки непосредственно из командной строки работает как чудо, но это нереальный вариант, когда пользователи подключаются и выполняют такие команды (heroku pg:psql -c "\copy Product (Id,SKU,Name,Active,Status,Quotable,L1,L2,L3,L4,Approval_Matrix) FROM 'E:\local_git\jc-home-dev\chart_data.csv' DELIMITER ',' CSV HEADER;"
). Мой супер-упрощенный код:
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<script src="upload.js"></script>
<div>
Upload Data:
<br>
<input type="file" id="uploadFile" name="uploadFile"
onchange="uploadFile(this.files[0])" accepts=".csv"/>
</div>
</body>
</html>
Javascript:
function uploadFile(file) {
var reader = new FileReader();
reader.readAsText(file);
reader.onload = loadHandler;
}
function loadHandler(e) {
var csv = e.target.result;
processData(csv);
}
function processData(csv) {
var allLines = csv.split(/\r\n|\n/);
var lines = [];
for (var i=0; i<allLines.length; i++) {
var data = allLines[i].split(',');
var tarr = [];
for (var j=0; j<data.length; j++) {
tarr.push(data[j]);
}
lines.push(tarr);
}
loadProduct(lines);
}
function loadProduct(data) {
console.log(data);
$.post(
'upload.php',
{rows: data},
function() {
console.log("Upload complete");
}
);
}
PHP:
<?php
require_once 'login.php';
$db_cnxn = pg_connect("
host=$host
dbname=$dbname
user=$user
password=$password
port=$port
") or die(
'Could not connect to database: ' . pg_last_error()
);
pg_copy_from($db_cnxn, "Product", $_POST['rows'], ',');
pg_close($db_cnxn);
?>
Любая помощь будет высоко ценится! Спасибо.