javascript - 如何通过 socket.io 将图像发送到服务器?
问题描述
我一直在努力解决这个问题,但找不到合适的解决方案。我希望能够通过 socket.io emit 将图像上传到服务器,然后再将它们保存到 MongoDB 数据库中。我该怎么做呢?我见过有人用base64编码来做,但我不知道它是如何工作的,这个网站上还有其他问题询问关于通过socket.io从服务器向客户端发送图像,但没有关于这个。感谢所有帮助。<3
目标:将图像上传到服务器socket.emit('image', someimagefile)
或类似服务器。
如果您提供类似的方式将图像发送给客户,我将不胜感激。
解决方案
正如您所提到的,您可以将图像转换为base64
使用FileReader.readAsDataURL
并发送编码字符串,并在服务器上对其进行解码:
document.getElementById('file').addEventListener('change', function() {
const reader = new FileReader();
reader.onload = function() {
const base64 = this.result.replace(/.*base64,/, '');
socket.emit('image', base64);
};
reader.readAsDataURL(this.files[0]);
}, false);
socket.on('image', async image => {
const buffer = Buffer.from(image, 'base64');
await fs.writeFile('/tmp/image', buffer).catch(console.error); // fs.promises
});
或者更好地用于FileReader.readAsArrayBuffer
获取您将发送到服务器的字节数组。
document.getElementById('file').addEventListener('change', function() {
const reader = new FileReader();
reader.onload = function() {
const bytes = new Uint8Array(this.result);
socket.emit('image', bytes);
};
reader.readAsArrayBuffer(this.files[0]);
}, false);
socket.on('image', async image => {
// image is an array of bytes
const buffer = Buffer.from(image);
await fs.writeFile('/tmp/image', buffer).catch(console.error); // fs.promises
});
从服务器接收:
// Server side
socket.emit('image', image.toString('base64')); // image should be a buffer
// Client side
socket.on('image', image => {
// create image with
const img = new Image();
// change image type to whatever you use, or detect it in the backend
// and send it if you support multiple extensions
img.src = `data:image/jpg;base64,${image}`;
// Insert it into the DOM
});
推荐阅读
- angular - AWS Cloud9 与 Angular 9
- vue.js - 在 bootstrap-vue 的 b-button-group 组件中添加图标?
- sql - 如何更新表,以便只有 1 个数字为 1 的值
- svg - 如何在页面的特定部分启动 svg 滚动动画
- asp.net-mvc - MVC 在视图或控制器中查询,结果不同
- python - asyncio.gather 的顺序版本
- android - 忽略 Android 上不规则的 CSV 文件行
- rubygems - Ruby 和 Rails 中的 gem 和包有什么区别?
- c# - 无法从 IMongoQueryable mongodb c# driver linq 语句的 GroupBy 中的组中获取组项
- nginx - Nginx 403 禁止