Мне нужна помощь, чтобы заставить пакет реагировать-dropzone NPM, чтобы загруженные файлы отображали предварительный просмотр файлов, отличных от файлов изображений (* .png, * .jpg / jpeg, * .gif, и т. д. - все они прекрасно генерируют предварительный просмотр)
В настоящее время, когда я использую Dropzone для загрузки сопутствующих файлов в веб-форму, если я загружаю файл изображения (* .png, * .jpg и т. Д.), Настроенный нами предварительный просмотр показывает очень хорошо с небольшим уменьшенным изображением. Загруженного файла. (см. фото ниже)
Однако, если я загружаю другой тип файла, скажем, MS-Outlook * .docx, * .xlsx или Adobe Acrobat * .pdf, он просто дает мне пустое поле с испорченным изображением файла и чем угодно alt="..."
текст, который я вставил туда, в данном случае, « Предварительный просмотр загруженного файла ». (см. фото ниже)
Код, который мы используем, был почти дословно скопирован с примера Preview на веб-сайте React Dropzon , так что мне интересно, пропустил ли я что-то здесь?
Вот что я пробовал -
- Создайте страницу
react-dropzone
<Dropzone>
, для которой она настроена на прием любого типа файла и дает ей возможность делать предварительный просмотр с кодом из https://react -dropzone. js.org/#previews, с «Preview» <aside>
внизу раздела <Dropzone>
кода.
- Перетаскивание любого файла изображения (* .png, * .jpg или * .jpeg, * .gif и т. Д.).
- Посмотрите на предварительный просмотр, который появляется (должно быть в порядке, эскиз файла изображения).
- Теперь Перетащите любой другой тип файла ( .doc , .xls , * .pdf и т. Д.) На
<Dropzone>
.
- Посмотрите на предварительный просмотр, который появляется для этого файла (должен быть пустым с изображением «испорченного файла» и любым текстом
alt="..."
, который у вас есть для описания файла).
Dropzone импортируется вверху файла -
import React, { Component, /* useCallback */ } from "react";
...
import Dropzone from "react-dropzone";
...
Стиль / CSS-код для миниатюр -
...
const thumbsContainer = {
display: "flex",
flexDirection: "row",
flexWrap: "wrap",
marginTop: 16
};
const thumb = {
display: "inline-flex",
borderRadius: 2,
border: "1px solid #eaeaea",
marginBottom: 8,
marginRight: 8,
width: 100,
height: 100,
padding: 4,
boxSizing: "border-box"
};
const thumbInner = {
display: "flex",
minWidth: 0,
overflow: "hidden"
};
const img = {
display: "block",
width: "auto",
height: "100%"
};
...
Функция обратного вызова onDrop()
-
...
onDrop = (acceptedFiles, rejectedFiles) => {
let files = acceptedFiles.map(async file => {
let data = new FormData();
data.append("file", file);
let item = await axios
.post("form/upload", data, {
headers: {
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(response => {
return Object.assign(file, {
preview: URL.createObjectURL(file),
filename: response.data.filename
});
})
.catch(err => {
let rejects = rejectedFiles.map(async file => {
let data = new FormData();
await data.append("file", file);
console.log("There was an error while attempting to add your files:", err);
console.log("The files that were rejected were:\n", rejects.join('\n'));
})
});
return item;
});
Promise.all(files)
.then(completed => {
let fileNames = completed.map(function(item) {
return item["filename"];
});
this.setState({ files: completed, fileNames: fileNames });
})
.catch(err => {
console.log('DROPZONE ERROR:', err);
});
};
...
И фактический код JSX с использованием <Dropzone>
в React.JS return()
-
...
<Form.Field>
<label>Upload Files or Screenshots</label>
<Dropzone accept={acceptedFileTypes} onDrop={this.onDrop}>
{({ getRootProps, getInputProps, isDragActive }) => {
return (
<div
{...getRootProps()}
className={classNames("dropzone", {
"dropzone--isActive": isDragActive
})}
>
<input {...getInputProps()} />
{isDragActive ? (
<div>
<div className="centered">
<Icon name="cloud upload" size="big" />
</div>
<div className="centered">Drop Files Here.</div>
<div className="centered">
<Button className="drop-button">
Or Click to Select
</Button>
</div>
</div>
) : (
<div>
<div className="centered">
<Icon name="cloud upload" size="big" />
</div>
<div className="centered">
Drag and Drop Supporting Files here to Upload.
</div>
<div className="centered">
<Button className="drop-button">
Or Click to Select
</Button>
</div>
</div>
)}
</div>
);
}}
</Dropzone>
<aside style={thumbsContainer}>{thumbs}</aside>
</Form.Field>
...
Ожидаемое поведение -
Я бы предпочел всем типам файлов для создания правильного предварительного просмотра.
Мои настройки -
- MacBook Pro 13-дюймовый 2018
- 2,7 ГГц Процессор Intel Core i7
- 16 ГБ, 2133 МГц, оперативная память LPDDR3
- MacOS версия 10.14.4
- React & React-DOM версии 16.5.2
- Node.JS версия 10.15.2
- версия пряжи 1.15.2
- React Dropzone версия 10.1.4
- Google Chrome для Mac OS, версия браузера 74.0.3729.131 (официальная сборка) (64-разрядная версия)
- Загрузка на сервер-контейнер экземпляра AWS EC2.
... Итак, я делаю что-то не так, чтобы не работали предварительные просмотры других файлов, кроме изображений? Разве это не функция для каких-либо файлов изображений? Пожалуйста, сообщите.
Пара других вопросов -
- Если предварительные просмотры не могут быть сгенерированы для файлов, отличных от файлов изображений с
react-dropzone
, есть ли способ, чтобы файлы изображений генерировали предварительные просмотры, но все остальные файлы просто перечисляют имя загружаемого файла и такие, как в некоторые другие примеры на вашем сайте React Dropzone ? Если это так, как вы переключаетесь между этими двумя, чтобы иметь оба при перетаскивании файлов на <Dropzone>
?
- В нашем кодекоторый, опять же, мы почти дословно скопировали из ваших примеров на веб-сайте React Dropzone , мы заметили, что когда вы перетаскиваете набор файлов на
<Dropzone>
, а затем пытаетесь перетаскивать во второй раз это стирает первый набор файлов с загрузки и заменяет их новыми файлами, которые только что были сброшены на <Dropzone>
. Есть ли способ, чтобы <Dropzone>
кумулятивно добавлять файлы при каждом их удалении, а не просто стирать предыдущие файлы и заменять их новыми? Если да, то какие шаги сделать это, пожалуйста?
- Есть ли способ, в случае наличия пустого поля «Просмотр файла» для всех других файлов, избавиться от значка «Сломанный файл»?
Я ценю любой конструктивный ответ, пожалуйста. Заранее спасибо.