В следующем ответе рассматривается интерфейсная часть вашего вопроса.См. https://stackoverflow.com/a/34698643/3105371 о внутреннем компоненте вашего вопроса.Возможно, вы захотите открыть другой вопрос, соответствующий вашим потребностям, на сервере.Если вы делаете, убедитесь, что вы включили информацию о вашей серверной среде.(expressjs, соответствующее промежуточное программное обеспечение и т. д.)
Рекомендация HTML 5.1 определяет интерфейс для ввода файлов.См на MDN.Глядя на таблицу совместимости в MDN, похоже, что это поддерживается современными браузерами.Обязательно проверьте перед проверкой изменения в производстве.
Введенный файл имеет атрибут files
, равный FileList
.FileList
- это коллекция File
объектов, предоставляющих свойство size
- размер файла в байтах.
В следующем примере <CustomInput type="file" />
передается onChange
propэто функция, которая проверяет размер файла.
Выполнить пример кода на https://stackblitz.com/edit/so-reactstrap-file-input?embed=1&file=Example.js
export default class Example extends Component {
state = {
fileName: '',
invalidFile: false,
}
handleFileChange = this.handleFileChange.bind(this);
handleFileChange({target: {files}}) {
const cancel = !files.length;
if (cancel) return;
const [{ size, name }] = files;
const maxSize = 50000;
if (size < maxSize) {
this.setState({ fileName: name, invalidFile: false })
} else {
this.setState({ fileName: '', invalidFile: true })
}
}
render() {
const { fileName, invalidFile } = this.state;
return (
<FormGroup>
<CustomInput
type="file"
id="exampleCustomFileBrowser"
name="customFile"
label={fileName || 'choose an image file'}
onChange={this.handleFileChange}
invalid={invalidFile} />
</FormGroup>
);
}
}