이번에는 Koa2에서 파일 업로드다운로드를 구현하는 단계에 대해 자세히 설명하겠습니다. 파일 업로드 및 다운로드를 구현하기 위한 Koa2의 주의 사항
은 무엇입니까? 다음은 실제 사례입니다. .머리말
웹 애플리케이션에서는 사진이든 다른 파일이든 업로드 및 다운로드가 비교적 일반적입니다. Koa에는 기능을 빠르게 구현하는 데 도움이 되는 미들웨어
가 많이 있습니다.파일 업로드
를 처리하고, 이를 통해 요청 본문을 ctx.request에 넣을 수 있습니다.// app.js const koa = require('koa'); const app = new koa(); const koaBody = require('koa-body'); app.use(koaBody({ multipart: true, formidable: { maxFileSize: 200*1024*1024 // 设置上传文件大小最大限制,默认2M } })); app.listen(3001, ()=>{ console.log('koa is listening in 3001'); })
읽을 수 있는 스트림은 reader.pipe(writer)
const router = require('koa-router')(); const fs = require('fs'); router.post('/upload', async (ctx){ const file = ctx.request.body.files.file; // 获取上传文件 const reader = fs.createReadStream(file.path); // 创建可读流 const ext = file.name.split('.').pop(); // 获取上传文件扩展名 const upStream = fs.createWriteStream(`upload/${Math.random().toString()}.${ext}`); // 创建可写流 reader.pipe(upStream); // 可读流通过管道写入可写流 return ctx.body = '上传成功'; })
const router = require('koa-router')(); const send = require('koa-send'); router.post('/download/:name', async (ctx){ const name = ctx.params.name; const path = `upload/${name}`; ctx.attachment(path); await send(ctx, path); })
<button onclick="handleClick()">立即下载</button> <script> const handleClick = () => { window.open('/download/1.png'); } </script>
<button onclick="handleClick()">立即下载</button> <iframe name="myIframe" style="display:none"></iframe> <script> const handleClick = () => { window.open('/download/1.png', 'myIframe'); } </script>
파일 패키징
archiver는 Node.js에서 크로스 플랫폼 패키징 기능을 구현할 수 있는 모듈로 zip 및 tar 형식을 지원합니다.const router = require('koa-router')(); const send = require('koa-send'); const archiver = require('archiver'); router.post('/downloadAll', async (ctx){ // 将要打包的文件列表 const list = [{name: '1.txt'},{name: '2.txt'}]; const zipName = '1.zip'; const zipStream = fs.createWriteStream(zipName); const zip = archiver('zip'); zip.pipe(zipStream); for (let i = 0; i < list.length; i++) { // 添加单个文件到压缩包 zip.append(fs.createReadStream(list[i].name), { name: list[i].name }) } await zip.finalize(); ctx.attachment(zipName); await send(ctx, zipName); })
const zipStream = fs.createWriteStream('1.zip'); const zip = archiver('zip'); zip.pipe(zipStream); // 添加整个文件夹到压缩包 zip.directory('upload/'); zip.finalize();
중국어 인코딩 문제
파일명에 중국어가 포함되어 있는 경우 예상치 못한 상황이 발생할 수 있습니다. 그래서 업로드할 때 한자가 포함되어 있으면 파일명을 encodeURI()로 인코딩해서 저장하고, 다운로드할 때 decodeURI()로 복호화하겠습니다.ctx.attachment(decodeURI(path)); await send(ctx, path);
// koa-send path = decode(path) function decode (path) { try { return decodeURIComponent(path) } catch (err) { return -1 } }
const router = require('koa-router')(); const sendfile = require('koa-sendfile'); router.post('/download/:name', async (ctx){ const name = ctx.params.name; const path = `upload/${name}`; ctx.attachment(decodeURI(path)); await sendfile(ctx, path); })
위 내용은 Koa2에서는 파일 업로드 및 다운로드 기능을 제공합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!