Nodejs POST не получает файл - PullRequest
0 голосов
/ 04 июля 2018

Я хочу создать API для получения загруженного файла из Интернета. Затем я обработаю проверку файла (чтобы узнать, является ли файл .png реальным .png вместо .exe), а затем отправлю файл другому API.

Но теперь я застрял в получении части файла.

Я искал в google и stackoverflow, но ни один из методов не работает.

Где я размещаю свой API: Функции Firebase

Пример кода:

HTML-код:

<html>
  <body>
    <form ref='uploadForm' 
      id='uploadForm' 
      action='https://<project>.cloudfunctions.net/api/upload' 
      method='post' 
      encType="multipart/form-data">
        <input type="file" name="sampleFile" />
        <input type='submit' value='Upload!' />
    </form>     
  </body>
</html>

Код NodeJS:

formidable

const functions = require('firebase-functions');
const express = require('express');
const app = express();

app.post('/upload', function (req, res) {
    console.log('initializing upload')
    var IncomingForm = require('formidable').IncomingForm

    var form = new IncomingForm()
    form.uploadDir = 'uploads'
    form.parse(req, function (err, fields, files) {
        if (err) {
            console.log('some error', err)
            res.status(400).send(err)
        } else if (!files.file) {
            console.log('no file received')
            res.status(400).send('no file received')
        } else {
            var file = files.file
            console.log('saved file to', file.path)
            console.log('original name', file.name)
            console.log('type', file.type)
            console.log('size', file.size)
            res.status(400).send(file.path, file.name, file.type, file.size)
        }
    })
});

exports.api = functions.https.onRequest(app)

connect-busboy

const functions = require('firebase-functions');
const express = require('express');
const app = express();

var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy()); 
//...
app.post('/upload', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        res.status('200').send('uploaded')
        // fstream = fs.createWriteStream(__dirname + '/files/' + filename);
        // file.pipe(fstream);
        // fstream.on('close', function () {
        //     res.redirect('back');
        // });
    });
});

exports.api = functions.https.onRequest(app)

express-fileupload

const functions = require('firebase-functions');
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

// default options
app.use(fileUpload());

app.post('/upload', function(req, res) {
    console.log('upload initializing')
  if (!req.files)
    return res.status(400).send('No files were uploaded.');

  // The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
  let sampleFile = req.files.sampleFile;

  if(req.files){
    console.log('File Uploaded')
    res.status('200').send('File uploaded!');
  }

});

exports.api = functions.https.onRequest(app)

multer

const functions = require('firebase-functions');
const express = require('express'); // call express
const app = express(); // define our app using express
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const router = express.Router();

const multer = require('multer');
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

const readChunk = require('read-chunk');
const fileType = require('file-type');


var returnSuccess = {
    resultCode: 1,
    resultDesc: '',
    resultData: '',
    dataCount: 0,
    resultAction: '',
    timeStamp: Date.now()
}

var returnFailed = {
    resultCode: -1,
    resultDesc: '',
    resultAction: '',
    timeStamp: Date.now()
}

router.post('/fileChecker', upload.single('doc'), function (req, res, next) {
    console.log('Initilize FileChecker')
    var files = []
    var checkResults = []
    var file = req.file
    files = req.files
    console.log(file)
    console.log(files)
    if(file){
        console.log('got the FILE!')
    }

    res.status(200).send('Processed Ntg')
});


app.use(router)

exports.api = functions.https.onRequest(app)

* Дополнительное примечание:

1) Для мультера хостинг Firebase выглядит не совместимым с опцией dest. При установке опции dest будет ошибка развертывания.

2) Весь код был протестирован после развертывания на хостинге firebase, я не тестировал на своем локальном компьютере.


У меня заканчивается идея, что происходит ... Пожалуйста, помогите ..

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Multer: механизм хранения памяти сохраняет файлы в памяти как Buffer объекты. У него нет никаких вариантов. При использовании памяти, информация о файле будет содержать поле с именем buffer, содержащее весь файл. См. Документы

Потому что вы загружаете память. Смотрите, действительно ли вы хотите загрузить данные в память или на диск?

0 голосов
/ 04 июля 2018

Извините, не полный ответ, но слишком многословно для комментариев. Просто чтобы проверить, работает ли multer, попробуйте универсальное промежуточное ПО и поместите его на раннем этапе в вашу цепочку промежуточного ПО (у меня есть мое после обработки Cors, но до разбора тела):

onFileUploadStart (file / *, req, res * /) { console.log ('multer.onFileUploadStart!', файл); Это должно поймать абсолютно все, что отправляет файл.

edit: я использую старые версии и устаревшие вещи, кажется ... извините.


Что при повторном рассмотрении вашего кода ... где ваша CORS-обработка? Это нужно для браузерных запросов между доменами, между протоколами или даже между портами.

Проверьте здесь https://enable -cors.org / server_expressjs.html или попробуйте пакет cors .

или Как разрешить CORS?

...