前端切片上传

切片上传

//前端代码
<body>
    <input type="file" id="input">
    <button id="btn">上传</button>

    <script>
        const btn = document.getElementById('btn');
        const input = document.getElementById('input');
        const chunkSize = 1024;
        let index = 0;
        btn.addEventListener('click', upload);

        function upload() {
            const file = input.files[0];
            const [filename, ext] = file.name.split('.')
            console.log(file);

            let start = index * chunkSize;
			//终止条件
            if (start > file.size) return;

            const blob = file.slice(start, start + chunkSize);
            const blobName = `${filename}${index}.${ext}`
            //new  File() new一个文件   文件二进制blob    文件二进制的名字blobName
            const blobFile = new File([blob], blobName)
            //创建一个表单数据
            const formData = new FormData();
			//我们可以通过append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾
            formData.append('file', blobFile)

            fetch('/upload', {
                method: 'post',
                body: formData
            }).then(() => {
                index++;
                //重复调用
                upload()
            })
        }
    </script>

</body>


//使用node.js模拟后端操作。
const Koa = require('koa');
const Router = require('koa-router');
const server = require('koa-static');
const multiparty = require('multiparty');


const path = require('path');
const fs = require('fs');


const app = new Koa();
const router = new Router();

router.post('/upload', async(ctx) => {
    var form = new multiparty.Form({
        uploadDir: 'temp'
    })

    form.parse(ctx.req);
    form.on('file', (name, file) => {
        const newPath = path.resolve(__dirname, 'temp', file.originalFilename)
        fs.rename(file.path, newPath, (err) => {
            if (err) console.log(err);
        })
        console.log('上传成功');
    })
    ctx.response.body = '请求成功';
})

app.use(router.routes());
app.use(server(path.join(__dirname, '/public')));

app.listen(3000, () => {
    console.log('server listen at port 3000');
})



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端切片上传是将文件切分成多个小部分(切片)后,逐个上传至服务器,最后将这些切片合并成完整文件的过程。以下是一个基本的前端切片上传代码实现: 1. 切片文件 ```javascript function sliceFile(file, chunkSize) { let chunks = []; let fileSize = file.size; let start = 0; let end = chunkSize; while (start < fileSize) { chunks.push(file.slice(start, end)); start = end; end = start + chunkSize; } return chunks; } ``` 以上代码将一个文件按照指定的大小切分成多个切片,每个切片的大小为 chunkSize。 2. 上传切片 ```javascript function uploadChunks(chunks, url, chunkSize) { let requests = []; for (let i = 0; i < chunks.length; i++) { let formData = new FormData(); formData.append('chunk', chunks[i]); requests.push( axios.post(url, formData, { headers: {'Content-Type': 'multipart/form-data'}, onUploadProgress: function(progressEvent) { let percentCompleted = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); console.log(percentCompleted); } }) ); } return Promise.all(requests); } ``` 以上代码切片逐个上传至服务器,并且在上传过程中打印上传进度。这里使用了 axios 库进行请求的发送。 3. 合并切片 ```javascript function mergeChunks(url, filename, chunksCount) { return axios.post(url, { filename: filename, chunksCount: chunksCount }); } ``` 以上代码将所有切片合并成完整文件并上传至服务器。 在实际开发中,你可能需要根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值