Сервер отвечает 'undefined', когда отправляет файл, используя сообщение ax ios с промежуточным программным обеспечением multer - PullRequest
0 голосов
/ 15 января 2020

Я использую ReactJS для создания простого приложения sendMail. И проблема в том, что я не получаю req.file на моем сервере (ExpressJS).

myForm. js

<form className="content-container mailing-form" encType='multipart/form-data'>
            <h1>Let's see if it works</h1>
            <div>
                <label>Mail: </label>
                <input type="text" value={this.state.email} onChange={this.handleChangeToMail} style={{ width: '50%' }} />
            </div>
            <div>
                <label>Subject: </label>
                <input type="text" value={this.state.subject} onChange={this.handleChangeSubject} style={{ width: '50%' }} />
            </div>
            <div>
                <textarea
                    id="test"
                    name="test-mailing"
                    onChange={this.handleChangeFeedback}
                    placeholder="Post some lorem ipsum here"
                    required
                    value={this.state.feedback}
                    style={{ width: '100%', height: '150px' }}
                />
            </div>
            <div> //Here is my input file
                <label>File: </label>
                <input
                    type="file"
                    onChange={this.handleChangeFile}
                    name="myFile"
                />
                <img src="" id="preview" alt="Image preview..."></img>
            </div>
            <input type="button" value="Submit" onClick={this.handleSubmit} />
        </form>

handleChangeFile

handleChangeFile = e => {
    e.preventDefault();

    let fReader = new FileReader();
    let file = '';

    fReader.readAsDataURL(e.target.files[0]);
    fReader.onloadend = (event) => {
        document.getElementById('preview').src = event.target.result;
        file = event.target.result;
        this.setState(() => ({ file }));
        console.log(this.state.file);
    }

}

handleSubmit

handleSubmit = e => {
    let formData = new FormData();

    formData.append('name', this.state.name);
    formData.append('email', this.state.email);
    formData.append('feedback', this.state.feedback);
    formData.append('subject', this.state.subject);
    formData.append('file', this.state.file);

    const config = {
        headers: {
            "Content-Type": "multipart/form-data",
            "Accept": "application/json",
            "type": "formData"
        }
    }

    const url = "http://localhost:8081/send";

    axios
        .post(
            url,
            formData,
            config
        )
        .then(res => console.log(res.data))
        .catch(err => console.log('Error: ', err));
}

Сервер. js

const nodemailer = require('nodemailer'); 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const cors = require('cors'); 
var multer = require('multer');

const app = express(); 
const port = 8081;

app.use(cors()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded()); 
app.use(bodyParser.urlencoded({ extended: true }));

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next(); });

app.get('/', (req, res) => res.send('......!'));


const storage = multer.diskStorage({
    destination: './uploads',
    filename: function (req, file, cb) {
        cb(null, file.fieldname + Date.now());
    } })

const uploads = multer({
    storage: storage 
}).single('myFile');

app.post('/send', uploads, (req, res) => {
    if (req.file) {
        res.send('Uploaded !');
    } else {
        res.send('Fail !!');
    }
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

И я продолжаю получать "Fail !!" сообщение в моей форме.

Я попытался добавить любое решение, которое смогу найти. Я знаю, что там может быть какой-то беспорядок, извините за это: ')!

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я решил свою проблему, благодаря этой теме: Преобразовать URI данных в файл, затем добавить к FormData

Я добавляю функцию для преобразования файла из странной строки base64 в тип Blob перед отправкой это на сервер. Тогда мой сервер может получить req.file !!

0 голосов
/ 15 января 2020

1. make your uploads folder as static folder

app.use (express .stati c («загрузка»));

2. change your destination like below

 destination : function( req , file , cb ){  
    cb(null,'./uploads');
 },
append your file as myFile in frontend

formData.append ('myFile', this.state.file);

...