axios上传文件,nodejs接收保存

本文深入讲解了前后端交互的关键技术,包括使用axios发起AJAX请求、处理跨域问题、通过socket.io实现实时通信,以及如何从前端上传文件并由后端接收与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

涉及知识点:

  • ajax请求 (使用:axios
  • 跨域
  • post提交
  • socket交互(使用:socket.io
  • buffer接收文件
  • stream保存文件

前端代码

var socket = io.connect('http://localhost:8080/product')
socket.on('progress', function (p) {
    console.log(p + '%')
})
// 获取<input id="file" type="file">的文件数据
var file = document.getElementById('file').files[0]
var instance = axios.create({
  // 要使用post提交必须设Content-Type为
  // application/x-www-form-urlencoded (键值对形式提交)或
  // multipart/form-data (二进制形式提交)
  headers: { 'Content-Type': 'multipart/form-data' }
})
instance.post('http://localhost:8080/product/upload/img?name=' + file.name +  '&size=' + file.size, file)

后端代码

const querystring = require('querystring')
const app = require('http').createServer(handler)
const io = require('socket.io')(app)

// 创建socket链接,这里使用了of进行域限定
const pro = io.of('/product').on('connection', socket => {
  // ...
})

function handler (req, res) {
  const params = querystring.parse(req.url.split('?')[1])

  // 跨域,因前端文件是直接拖到浏览器上运行以file://形式访问,与后台不在同一域,所以要跨域处理
  res.writeHead(200, {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET,POST'
  })
  // 处理以/product/upload/img开头的请求
  if (/^\/product\/upload\/img/.test(req.url)) {
    const size = params.size
    const name = params.name
    const buf = []
    let count = 0
    
    // 接收数据事件,会多次触发,chunk的格式为nodejs的Butter,大小不大于65535
    req.on('data', (chunk) => {
      buf.push(chunk)
      count += chunk.length
      // 将进度返回给前端
      pro.emit('progress', Math.round(count / size * 100))
    })

    // 数据接收结束保存图片
    req.on('end', () => {
       // 创建流(stream)
       const ws = fs.createWriteStream(path.resolve(__dirname, 'images', name))
       // 将暂存好的Buffer写入流
       buf.forEach(i => {
         ws.write(i)
       })
       ws.end()
    })
  }     
  res.end('{msg:"success"}', 'utf8')
}

app.listen(process.argv[2] || 8080)

转载于:https://my.oschina.net/cjlice/blog/1545997

### 回答1: 前端通过formdata的方式上传文件,可以使用表单文件控件或者通过js代码创建formdata对象进行上传。对于表单控件上传,需要在form标签中设置enctype属性为multipart/form-data,然后在input标签中设置type属性为file,这样即可将文件存储在formdata对象中。如果通过js代码创建formdata对象,直接通过append方法将文件添加到对象中,如下所示: ``` let formData = new FormData(); formData.append('file', file); ``` 其中,file为需要上传文件对象。 后端使用koa-body中间件可以方便地处理上传文件。先要在koa应用中使用该中间件,然后通过ctx.request.files获取上传文件,如下所示: ``` const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); app.use(koaBody({ multipart: true, // 支持文件上传 formidable: { maxFileSize: 200*1024*1024, // 设置上传文件大小,默认2M } })); app.use(async (ctx) => { const file = ctx.request.files.file; console.log(file.name, file.size); // 打印上传文件名和大小 ctx.body = '上传成功'; }) ``` 其中,multipart设置为true表示支持文件上传,formidable对象中的maxFileSize表示最大上传文件大小,默认为2M。在处理上传文件时,获取文件对象通过ctx.request.files即可,可以获取文件名、类型、大小等信息。最后,需要设置返回的数据为上传成功即可。 ### 回答2: 前端在实现文件上传的过程中,需要使用到formdata对象,formdata对象可以支持上传文件、文本信息以及表单数据等。要进行文件上传,需要注意选择文件类型的input的属性设置为"file",然后通过formdata对象将文件添加到数据中,在使用Ajax等技术将数据发送给后端。在使用formdata上传文件时,需要注意不同浏览器之间formdata对象的兼容性,可以使用polyfill等技术来进行统一。 对于后端的Koa框架来说,接收上传文件可以使用koa-body中间件。koa-body中间件可以接收文件、文本信息以及表单数据等,可以将上传文件保存在指定的路径下,并且将上传文件信息添加到ctx.request.body中进行统一管理。在使用koa-body中间件时,需要注意对于文件大小、上传路径、文件格式等进行配置管理,以免出现上传失败或者数据丢失的情况。 除此之外,如何管理和处理上传文件也是需要考虑的重点,可以考虑使用nodejs中的fs模块进行文件操作,或者使用第三方插件如multer等来进行统一管理。在处理上传文件时,还要注意对于文件大小、路径、格式进行校验和处理,以确保数据的有效性和安全性。 ### 回答3: 前端使用Formdata来上传文件,示例如下: ``` const formData = new FormData() formData.append('file', file) axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then((res) => { console.log(res.data) }) ``` 后端使用koa-body来接收上传文件,示例如下: ``` const Koa = require('koa') const koaBody = require('koa-body') const app = new Koa() app.use(koaBody({ multipart: true, formidable: { uploadDir: './uploads', // 上传文件保存的路径 keepExtensions: true, // 保留文件扩展名 maxFieldsSize: 2 * 1024 * 1024 // 最大文件大小为2MB } })) app.use(async (ctx) => { const file = ctx.request.files.file console.log(file) // 处理文件逻辑 }) app.listen(3000) ``` 其中,koa-body需要设置multipart为true,表示支持文件上传,formidable则可以设置一些参数,如uploadDir表示文件保存的路径,keepExtensions表示是否保留文件扩展名,maxFieldsSize表示最大文件大小,可以根据需要进行调整。在处理请求时,可以通过ctx.request.files.file获取上传文件信息,然后进行相应的业务逻辑处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值