TLDR: Как я могу передать 2 значения, чтобы выразить реакцию от реакции при загрузке файла?
У меня есть экспресс-маршрут, который должен принимать 2 значения img_url
и image title
.
const img = new Image({
img_url:result.url,
image_title:req.body.image_title
});
В настоящее время я могу опубликовать img_url
от реакции на экспресс, однако у меня возникают проблемы с отправкой image_title
. Итак, чтобы заставить это работать сейчас, я делаю image_title:null
Я использую response-images-upload для передачи файла
И делая это в одиночку, передает в img_url экспресс-маршрут,
handleUpload = file => {
const data = new FormData()
const image = file[0]
console.log(this.state.image_title)
// debugger;
data.append('ourImage',image)
data.append('image_title', this.state.image_title)
Axios.post('/images/upload', data).then((response) => {
console.log(response);
this.setState({
image_url:response.data.img_url,
// images: [...this.state.images, this.state.image_url ]
})
});
console.log(this.state.image_url);
}
<ImageUploader
withIcon={true}
withPreview={true}
onChange={this.handleUpload}
buttonText='Upload an image'
imgExtension={['.jpg', '.gif', '.png', '.gif']}
maxFileSize={5242880}
/>
Однако я хочу передать оба значения image title и сам img_url.Таким образом, в моей попытке я создаю форму, подобную этой, , но моя попытка не отправляет заголовок изображения на экспресс-маршрут.Моя попытка выдает ошибку
POST / images / upload 500 30,398 мс - 703 1 Ошибка типа: невозможно прочитать свойство 'путь' из неопределенного 1 в пути (/Users/eli/nodework/myexpressknex/routes/images.js:41:37)
Моя попытка
<form onSubmit={this.handleUpload}>
<TextField
id="outlined-name2"
label="Image Title"
fullWidth
name="image_title"
value={this.state.image_title}
onChange={this.handleChange}
margin="normal"
/>
<ImageUploader
withIcon={true}
withPreview={true}
// onChange={this.handleUpload}
buttonText='Upload an image'
imgExtension={['.jpg', '.gif', '.png', '.gif']}
maxFileSize={5242880}
/>
<Button variant="outlined" color="primary" type="submit">
Submit
</Button>
<br></br>
<br></br>
</form>
Итак, как я мог бы передать оба значения, чтобы выразить от реакции при загрузке файла?
экспресс-маршрут
import express from 'express';
import passport from 'passport';
import multer from 'multer';
import Image from '../models/Image'
import cloudinary from 'cloudinary';
import multipart from 'connect-multiparty';
import var_dump from 'var_dump';
import dd from 'dump-die';
const multipartMiddleware = multipart();
const cloud = cloudinary.v2
const router = express.Router();
const storage = multer.memoryStorage();
const upload = multer({ storage });
cloudinary.config({
cloud_name: process.env.cloudinaryName,
api_key: process.env.cloudinaryKey,
api_secret: process.env.cloudinarySecret,
})
router.get('/uploads', (req, res) => {
Image.forge().fetchAll().then( (images) => {
res.json(images.toJSON());
})
})
router.post('/upload', multipartMiddleware, upload.single('ourImage'), (req, res) => {
if(!req.files){
return res.status(500).send("Please upload a file");
}
console.log(req.files.ourImage.path)
cloud.uploader.upload(req.files.ourImage.path, {crop: "thumb", folder: '/uploads'} , (err, result) => {
if(err){
return res.status(500).send(err);
}
const img = new Image({
img_url:result.url,
image_title:null
});
// console.log(img);
img.save().then( img => {
return res.status(200).json(img);
});
});
});
export default router;
реагировать сторона
import React, { Component } from "react";
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Grid from '@material-ui/core/Grid';
import Typography from '@material-ui/core/Typography';
import ImageUploader from 'react-images-upload';
import Axios from '../Axios';
import Image from './Image';
class Dashboard extends Component{
constructor(props){
super();
this.state = {
image_url: 'http://www.conservewildlifenj.org/images/artmax_1001.jpg',
images: [],
image_title:''
}
}
handleUpload = file => {
const data = new FormData()
const image = file[0]
console.log(this.state.image_title)
// debugger;
data.append('ourImage',image)
data.append('image_title', this.state.image_title)
Axios.post('/images/upload', data).then((response) => {
console.log(response);
this.setState({
image_url:response.data.img_url,
// images: [...this.state.images, this.state.image_url ]
})
});
console.log(this.state.image_url);
}
handleChange = (e) => {
// e.preventDefault();
this.setState({
[e.target.name]: e.target.value
})
}
// fileOnchange = (file) => {
// this.setState({
// [file[0].target.name]: file[0].target.value
// })
// }
componentWillMount(){
Axios.get('/images/uploads').then( (response) => {
let img;
Object.keys(response.data).forEach( (key) => {
img = response.data[key].img_url
console.log(key, img);
this.setState({
images: [...this.state.images, img]
})
});
})
}
componentDidUpdate(nextProps, prevState) {
if (this.state.image_url !== prevState.image_url) {
this.setState({
images: [ this.state.image_url, ...this.state.images]
});
}
}
render(){
return(
<div>
<Grid container justify="center" spacing={16}>
<Grid item sm={8} md={6} style={{ margin: '40px 0px', padding: '0px 30px'}}>
<Typography align="center" variant="h6">
Welcome to the Dashboard
</Typography>
<form onSubmit={this.handleUpload}>
<TextField
id="outlined-name2"
label="Image Title"
fullWidth
name="image_title"
value={this.state.image_title}
onChange={this.handleChange}
margin="normal"
/>
<ImageUploader
withIcon={true}
withPreview={true}
// onChange={this.handleUpload}
buttonText='Upload an image'
imgExtension={['.jpg', '.gif', '.png', '.gif']}
maxFileSize={5242880}
/>
<Button variant="outlined" color="primary" type="submit">
Submit
</Button>
<br></br>
<br></br>
</form>
{this.state.images.length > 0 ? (
this.state.images.map( (img, i) => (
<Grid item md={8} key={i}>
{/* <Image image_url={this.state.image_url}/> */}
<Image image_url={img} />
</Grid>
))
) : (
<div>
<Grid item md={8}>
<Typography>No Images yet</Typography>
</Grid>
</div>
)}
</Grid>
{/* Images */}
</Grid>
</div>
)
}
}
export default Dashboard;