Estoy aprendiendo nodejs y usando multer, ajax jquery para el archivo cargado, pero me siento un poco confundido. Supongamos que tengo este código en el archivo html
<form action="/" method='post' enctype="multipart/form-data" id='form-data'> <input type="file" name='file' id='file' class='file'> </form>y el guión:
<script> $(document).on('change', '#file', function () { var property = document.getElementById('file').files[0]; var form_data = new FormData(); form_data.append('file', property); $.post({ url: '/', type: 'post', data: form_data, contentType: false, cache: false, processData: false, success: function (data) { console.log(data); } }) }) </script>En server.js (lado del servidor) tengo este código:
var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads') }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)) } }) var upload = multer({ storage: storage }) app.post('/', upload.single('file'), (req,res) =>{ console.log(req.body); console.log(req.file); })Este código se ejecuta sin problemas. Pero estas preguntas que me molestan:
En el script, línea 9, si uso "data: property" en lugar de "data: form_data", ya no funciona, req.file está vacío. ¿Por qué no podemos pasar directamente la variable "propiedad" a los datos pero debemos usar un objeto FormData para hacerlo?
Multer está diseñado para analizar datos codificados usando el formato multipart/form-data (que consta de cualquier cantidad de bits de datos (como archivos y fragmentos de texto) separados por marcadores de límite).
La API de FormData le permite recopilar diferentes piezas de datos, incluidos archivos, y generar datos de varias partes multipart/form-data con ellos.
Si pasa jQuery el valor de la property directamente, estará enviando el archivo, que puede ser text/plain o image/png o casi cualquier cosa, sin ninguna codificación adicional. Es muy poco probable que sean multipart/form-data formatos, ya que las personas generalmente no almacenan datos en ese formato.
Puede escribir código del lado del servidor que espera un archivo sin procesar, pero si lo hiciera, no estaría usando Multer.