I have this HTML
<div class="row">
<div class="col-md-6">
<input type="file" class="filepond" name="filepond-inspections-file" data-max-file-size="3MB" data-max-files="1"/>
</div>
<div class="col-md-6">
<div id="filePreview"></div>
</div>
</div>
This JS
$(document).ready(function () {
const inputInspectionFile = document.querySelector('input[name="filepond-inspections-file"]');
const pondSquare = FilePond.create(inputInspectionFile, {
stylePanelLayout: 'compact square',
acceptedFileTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
allowFileTypeValidation: true,
allowMultiple: false,
server: {
process: {
url: '' + getURLConnection() + 'api/analytics/dailyInspectionsFile.php',
method: 'POST',
dataType: "json",
withCredentials: false,
headers: {},
ondata: (formData) => {
formData.append('customField', 'value');
return formData;
},
onload: (response) => {
console.log(response);
},
onerror: (response) => {
console.error('Error durante la carga del archivo:', response);
console.error('Detalles del error:', response.error);
}
},
revert: {
url: '' + getURLConnection() + 'api/analytics/revertDailyInspectionsFile.php',
method: 'DELETE',
withCredentials: false,
headers: {}
},
load: null
}
});
pondSquare.on('processfile', (error, file) => {
const filePreview = document.getElementById('filePreview');
filePreview.innerHTML = `<p>Vista previa del archivo:</p>`;
if (error) {
console.error('Error durante el procesamiento del archivo:', error);
filePreview.innerHTML += `<p><span class="text-danger">Error:</span> ${error}</p>`;
} else {
if (file.fileType.includes('image')) {
filePreview.innerHTML += `<img src="${file.getFileEncodeDataURL()}" alt="Vista previa" style="max-width: 100%;">`;
} else if (file.fileType.includes('spreadsheet')) {
filePreview.innerHTML += `<p>Archivo de hojas de cálculo: ${file.filename}</p>`;
pondSquare.processFile(file.file)
.then((response) => {
console.log(response);
if (response && response.success) {
filePreview.innerHTML += `<pre>Preview: ${JSON.stringify(response.preview, null, 2)}</pre>`;
} else {
filePreview.innerHTML += `<p><span class="text-danger">Error:</span> ${response && response.error ? response.error : 'undefined'}</p>`;
}
})
.catch((error) => {
console.error('Error durante la carga o procesamiento del archivo:', error);
filePreview.innerHTML += `<p><span class="text-danger">Error:</span> ${error.message || 'undefined'}</p>`;
});
} else {
filePreview.innerHTML += `<p><span class="text-danger">Archivo no compatible:</span> <strong>${file.filename}</strong> solo se permiten archivos .xlsx</p>`;
}
}
});
});
And this PHP file which process the xlsx file:
<?php
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Verifica si se ha subido un archivo
if (isset($_FILES['filepond-inspections-file']) && $_FILES['filepond-inspections-file']['error'] === UPLOAD_ERR_OK) {
// Lee el archivo Excel con PhpSpreadsheet
$spreadsheet = IOFactory::load($_FILES['filepond-inspections-file']['tmp_name']);
$worksheet = $spreadsheet->getActiveSheet();
// Define las cabeceras esperadas en tu Excel
$expectedHeaders = ['id_equipo', 'id_categoria', 'descripcion', 'solucion', 'indicador', 'creado'];
// Obtén las cabeceras del archivo Excel
$excelHeaders = [];
foreach ($worksheet->getRowIterator(1, 1) as $row) {
foreach ($row->getCellIterator() as $cell) {
$value = $cell->getValue();
if ($value !== null) {
$excelHeaders[] = $value;
}
}
}
// Verifica si las cabeceras son correctas
if ($excelHeaders !== $expectedHeaders) {
echo json_encode(['error' => 'Las cabeceras del archivo no son válidas.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
// Obtén los datos
$data = [];
foreach ($worksheet->getRowIterator(2) as $row) {
$rowData = [];
foreach ($row->getCellIterator() as $cell) {
$value = $cell->getValue();
if ($value !== null) {
$rowData[] = $value;
}
}
// Verifica que el número de elementos en $rowData sea igual al de $excelHeaders
if (count($rowData) === count($excelHeaders)) {
$data[] = array_combine($excelHeaders, $rowData);
} else {
// Muestra un mensaje de error detallado
echo json_encode(['error' => 'Error en la estructura del archivo Excel. Detalles: ' . print_r($rowData, true)], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
}
// Obtén la vista previa de los primeros 5 registros en formato JSON
$previewData = array_slice($data, 0, 5);
/*
Devuelve la vista previa y los datos del Excel en formato JSON
preview => Devuelve los primeros 5 registros como vista previa.
data => Devuelve todos los registros extraidos del Excel
echo json_encode(['success' => true, 'preview' => $previewData, 'data' => $data], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
*/
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['success' => true, 'preview' => $previewData], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} else {
echo json_encode(['error' => 'Error al subir el archivo.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
} else {
echo json_encode(['error' => 'Método no permitido.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
?>
And almost everything works well because I get this response in console:
{
"success":true,
"preview":[
{"id_equipo":"7929686520 ","id_categoria":"Plantas","descripcion":"Descripción 1","solucion":"Solución 1","indicador":"Solucionado","creado":44931},
{"id_equipo":"1785819840 ","id_categoria":"Plantas","descripcion":"Descripción 2","solucion":"Solución 2","indicador":"Pendiente","creado":44931},
{"id_equipo":"3186288135 ","id_categoria":"Plantas","descripcion":"Descripción 3","solucion":"Solución 3","indicador":"Urgente","creado":44931},
{"id_equipo":"3241755463 ","id_categoria":"Plantas","descripcion":"Descripción 4","solucion":"Solución 4","indicador":"Solucionado","creado":44931},
{"id_equipo":"2608773869 ","id_categoria":"Plantas","descripcion":"Descripción 5","solucion":"Solución 5","indicador":"Pendiente","creado":44931}
]
}
However after a few seconds I get this error:
Error durante la carga o procesamiento del archivo:
{error: {…}, file: null}
error: body: "Item not found"
code: 0
headers: undefined
type: "error"
[[Prototype]]:
Objectfile: null
[[Prototype]]: Objectconstructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()__proto__: (...)get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()
(anonymous) @ inspectionsFile.js:60
Promise.catch (async)
(anonymous) @ inspectionsFile.js:59
(anonymous) @ filepond.min.js:9
setTimeout (async)
(anonymous) @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
n @ filepond.min.js:9
fire @ filepond.min.js:9
h @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
setTimeout (async)
(anonymous) @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
g @ filepond.min.js:9
_write @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
(anonymous) @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
requestAnimationFrame (async)
u @ filepond.min.js:9
e @ filepond.min.js:9
Why I'm getting file null if I already got the result in JSON response? It does not write in my section filePreview as expected.
I really appreciate your help!!