또 다른 방법과 미리보기 이미지를 렌더링합니다 아래의 예는 React 16+ 구문을 사용하며 API로 보내기 위해 하나의 이미지 파일 만 허용하지만 약간의 미세 조정을 통해 여러 이미지 및 기타 입력 필드로 확장 할 수도 있습니다.
renderDropZone.js (DROPZONE 성분)
import map from 'lodash/map';
import React, { Fragment } from 'react';
import DropZone from 'react-dropzone';
const RenderDropZone = ({
errors,
handleOnDrop,
input,
imageFileToUpload,
label,
touched
}) => {
const renderImagePreview =() => {
map(imageFileToUpload, ({ name, preview, size }) => {
return [
<li key="imagePreview>
<img src={ preview } alt={ name } />
</li>,
<li key="imageDetails">
{ name } - { size } bytes
</li>
]
});
};
return [
<Fragment>
<DropZone
accept="image/jpeg, image/png, image/gif, image/bmp"
className="upload-container"
onDrop={handleOnDrop}
onChange={fileToUpload => input.onChange(fileToUpload)}
>
{imageFileToUpload.length > 0
? <ul className="uploaded-images-container">
{ renderImagePreview() }
</ul>
: <p>Click or drag image file to this area to upload.</p>
}
</DropZone>
{ touched && error && <div className="error-handlers">{ error }</div> }
<label className="form-label">{ label }</label>
</Fragment>
);
};
export default RenderDropZone;
UploadForm.js (돌아 오는 폼 성분)
import React, { Component } from 'react';
import { Form, Field, reduxForm } from 'redux-form';;
import RenderDropZone from './renderDropZone';
const imageIsRequired = value => ({ !value ? 'Required' : undefined });
class UploadForm extends Component {
state = { imageFileToUpload: [] };
handleOnDrop = newImage => this.setState({ imageFileToUpload: newImage });
render() {
const { handleSubmit, pristine, reset, submitting } = this.props;
return (
<div className="form-container col-xs-12">
<h1>Upload An Image</h1>
<hr />
<Form onSubmit={handleSubmit}>
<Field
name="imageToUpload"
component={({ input, meta: { error, touched } }) =>
<RenderDropZone
error={error}
handleOnDrop={this.handleOnDrop}
input={input}
imageFileToUpload={this.state.imageFileToUpload}
label="Upload Image"
touched={touched}
/>
}
type="file"
placeholder="Upload Image"
validate={[imageIsRequired]}
/>
<button
type="submit"
className="submit btn btn-primary"
disabled={submitting}
>
Submit
</button>
<button
type="button"
className="clear-values btn btn-danger"
disabled={pristine || submitting}
onClick={() =>
this.setState({ imageFileToUpload: [] });
reset();
}
>
Clear
</button>
</Form>
</div>
);
};
};
export default reduxForm({
form: 'UploadForm'
})(UploadForm);
renderUploadForm.js (위에서 모두를 취하고 형태를 도시 사용자; 제출 된 돌아 오는 형태 소품)
import React, { Component } from 'react';
import { reduxForm } from 'redux-form';
import createFormData from './configFormData';
import UploadForm from './UploadForm';
const RenderUploadForm =() => {
const handleFormSubmit = formProps => {
const formData = createFormData(formProps);
/* create an AJAX POST request here with the created formData */
};
return <UploadForm onSubmit={formProps => handleFormSubmit(formProps)}/>
};
export default reduxForm({
form: 'UploadForm'
})(RenderUploadForm);
configFormData.js (API가 결국 AJAX POST 요청에 따라 읽기 위해 돌아 오는 형태 소품에서 FormData를 생성)
const createFormData = ({ imageToUpload }) => {
const fd = new FormData();
fd.append('imageFile', imageToUpload[0]);
/*
Examples of appending other inputs -- the specified name inside
the single quotes can be named anything, while the second
parameter MUST be the "name" specified in the Redux Form component:
<Field name='textinputName' type='text'>Example</Field>
fd.append('nameofTextInput', textinputName);
fd.append('nameofTextArea', textareaName);
fd.append('nameofCheckBox', checkboxName);
...etc
*/
return fd;
};
export default createFormData;
예를 포착 할뿐만 아니라 : 예/미리보기 W :
'onDrop' 함수에서받은 파일은 서버에 보내기 전에'FileReader'로 읽어야한다고 생각합니다. 그렇지 않으면 그건 쓸데 없어. 원래 질문에 완전히 대답하는 데 도움이된다면 여기에 예제를 추가 할 수 있습니다. –