Настройка:
- Node.JS(v8.9.4)
- Экспресс (v4.16.2)
- Superagent v3.8.2(https://github.com/visionmedia/superagent) для POST от клиента
- мультипликатор для загрузки файлов (v1.3.0)
- Реагировать/Вавилон/Вебпак
- CentOS 7, Vultr VPS
- Ограничение размера файла увеличено до 50 МБ с
nginx
иmulter
. - Развернуто частным git (версия едина для всей платформы)
Симптом:
Когда смесь строковых данных JSON и изображения отправляется через HTTP-вызов POST, сервер получает случайное количество изображений через multer(multer.any()
). Файл загружен и существует в общей папке сервера. req.body
тоже в порядке, но почему-то я не могу получить доступ к req.files
. он возвращает undefined
. С heroku и локального хоста моего рабочего стола приложение работает нормально. Изображение загружено нормально, доступ к req.files
данным также не вызывает проблем. Проблема только с сервером VPS/CentOS7.
Клиентская сторона (React/Superagent/Babel/Webpack)
import request from 'superagent'
request.post('/modwimg')
.query({
//some token and other info goes here
})
.accept('application/json')
.field('data',JSON.stringify(jsonData))
.attach('image',this.state.imagedata)
.attach('bannerimage',this.state.bannerimagedata)
.then((res)=>{
console.log('upload finished')
this.setState({goback:true})
})
.catch((err)=>{
})
На стороне сервера
const bodyParser = require('body-parser')
const multer = require('multer')
const pubDir = path.join(__dirname, 'pub')
const storage = multer.diskStorage({
destination: (req,file,cb)=>{
cb(null,'pub/')
},
filename: (req,file,cb)=>{
cb(null,Date.now() + file.originalname)
}
})
const upload = multer({storage:storage})
//allowing public access, image goes to public dir
app.use('/pub', express.static(pubDir))
/* initialize bodyparser to build up RESTful app */
//file size limit expansion
app.use(bodyParser.urlencoded({limit:'50mb', extended:true}))
app.use(bodyParser.json({limit:'50mb'}))
app.post('/imageupload',upload.any(),(req,res,next)=>{
//some token approval goes here
console.log(req.files) // <----this returns undefined data, but image is still uploaded
console.log(req.body) // <---- this is fine!!
//putting data(JSON.parse(req.body)) to db
db.any( //....
)
//then respond to client
res.json({result:true})
})
package.json
, экспресс-версии практически одинаковы. - person Sungryeol Park   schedule 06.03.2018