使用HTML+JS实现图片上传与图片拖拽排序功能,要求处理网络传输异常情况与限制文件大小,对已上传的文件进行归类
时间: 2024-03-25 16:40:40 浏览: 96
好的,可以的。我可以为您解答这个问题。
首先,我们需要一个 HTML 表单元素和一个 JavaScript 函数来实现图片上传。以下是一个简单的示例:
```html
<form id="upload-form">
<input type="file" id="file-input" name="image" accept="image/*" multiple>
<button type="submit">上传图片</button>
</form>
```
```javascript
const form = document.querySelector('#upload-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const formData = new FormData(event.target);
const response = await fetch('/upload', {
method: 'POST',
body: formData,
});
if (response.ok) {
alert('上传成功!');
} else {
alert('上传失败!');
}
});
```
上述代码的作用是,当用户选择一张或多张图片并点击“上传图片”按钮时,会将所选图片文件打包成一个 FormData 对象,并通过 fetch API 发送到服务器上的 '/upload' 路径。如果上传成功,会弹出一个提示框;如果上传失败,也会弹出一个提示框。
接下来,我们需要实现图片拖拽排序功能。这个功能需要用到 HTML5 的拖放 API。以下是一个示例:
```html
<ul id="sortable-list">
<li><img src="image1.jpg"></li>
<li><img src="image2.jpg"></li>
<li><img src="image3.jpg"></li>
</ul>
```
```javascript
const sortableList = document.querySelector('#sortable-list');
sortableList.addEventListener('dragstart', (event) => {
event.dataTransfer.setData('text/plain', event.target.dataset.index);
});
sortableList.addEventListener('dragover', (event) => {
event.preventDefault();
const target = event.target.closest('li');
if (target) {
target.classList.add('dragover');
}
});
sortableList.addEventListener('dragleave', (event) => {
const target = event.target.closest('li');
if (target) {
target.classList.remove('dragover');
}
});
sortableList.addEventListener('drop', (event) => {
event.preventDefault();
const sourceIndex = event.dataTransfer.getData('text/plain');
const source = sortableList.querySelector(`li[data-index="${sourceIndex}"]`);
const target = event.target.closest('li');
if (target && target !== source) {
const targetIndex = target.dataset.index;
if (sourceIndex < targetIndex) {
target.insertAdjacentElement('afterend', source);
} else {
target.insertAdjacentElement('beforebegin', source);
}
}
});
```
上述代码的作用是,当用户将列表中的某一项拖拽到其他位置时,会触发相应的事件。拖拽开始时,会将被拖拽项的索引存入 dataTransfer 对象中;拖拽过程中,会高亮鼠标经过的目标项;拖拽结束时,会将被拖拽项插入到目标项的前面或后面。
最后,我们需要处理网络传输异常情况和限制文件大小。这些问题可以在服务器端进行处理。以下是一个示例:
```javascript
const multer = require('multer');
const upload = multer({
limits: { fileSize: 1024 * 1024 }, // 限制文件大小为 1MB
fileFilter: (req, file, cb) => {
if (!file.mimetype.startsWith('image/')) { // 只接受图片文件
return cb(new Error('文件类型错误!'));
}
cb(null, true);
},
}).single('image');
app.post('/upload', (req, res) => {
upload(req, res, (error) => {
if (error) {
console.error(error);
res.status(400).send(error.message);
} else {
console.log(req.file);
res.send('上传成功!');
}
});
});
```
上述代码的作用是,使用 multer 中间件处理文件上传请求,并限制文件大小为 1MB,只接受图片文件。如果上传失败,会返回 400 错误码和错误信息;如果上传成功,会在控制台输出文件信息,并返回上传成功的提示信息。
对于已上传的文件进行归类,可以在上传成功后进行处理。以下是一个示例:
```javascript
const fs = require('fs');
const path = require('path');
app.post('/upload', (req, res) => {
upload(req, res, async (error) => {
if (error) {
console.error(error);
res.status(400).send(error.message);
} else {
console.log(req.file);
const { filename } = req.file;
const extname = path.extname(filename);
const dirname = path.join(__dirname, 'uploads', extname.slice(1));
if (!fs.existsSync(dirname)) {
fs.mkdirSync(dirname, { recursive: true });
}
const destname = path.join(dirname, filename);
fs.renameSync(req.file.path, destname);
res.send('上传成功!');
}
});
});
```
上述代码的作用是,在上传成功后,将文件移动到以文件类型为名的子目录中,并重命名为原始文件名。例如,如果上传的是一张名为 'image.jpg' 的图片,会将它移动到 'uploads/jpg/image.jpg' 目录中。如果目录不存在,则会自动创建。
阅读全文