Nodejs 怎么获得上传图片的进度数值并输出给我的iOS app用呢
Nodejs 怎么获得上传图片的进度数值并输出给我的iOS app用呢
我现在有个API是这样的:
app.post('/event', function (req, res) {
fs.readFile(req.files.displayImage.path, function (err, data) {
var newPath = __dirname + '/uploads/' + req.files.displayImage.name;
fs.writeFile(newPath, data, function (err) {
if (!err) {
var pic = req.files.displayImage.name;
connection.query('INSERT INTO Event SET ?', {pic: pic}, function (error, result) {
if (error) {
res.send(error, 400);
} else {
res.send({insertId: result.insertId}, 200);
}
});
}
});
});
});
我想在我的iOS app里做一个上传进度条。但是我的API怎么才能把图片上传的进度值打印出来并输出给我的app用呢。哎!node都是边学边做,痛苦啊。
为了在你的Node.js API中获取上传图片的进度并将其发送到iOS应用,你可以使用busboy
或multer
这类中间件来处理文件上传,并通过WebSocket或HTTP响应头等方式将进度信息传递给客户端。这里我将展示如何使用busboy
来实现这一功能。
首先,你需要安装busboy
:
npm install busboy
然后修改你的API代码以支持进度跟踪:
const express = require('express');
const Busboy = require('busboy');
const app = express();
app.post('/event', function (req, res) {
const busboy = new Busboy({ headers: req.headers });
let progress = 0;
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
console.log(`File [${fieldname}] received.`);
const saveTo = path.join(__dirname, '/uploads/', filename);
file.on('data', function (data) {
progress += data.length;
console.log(`File [${filename}] got ${data.length} bytes`);
});
file.on('end', function () {
console.log(`File [${filename}] Finished.`);
});
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', function () {
console.log("Done parsing form!");
// 这里可以执行数据库操作等
connection.query('INSERT INTO Event SET ?', { pic: filename }, function (error, result) {
if (error) {
res.send(error, 400);
} else {
res.send({ insertId: result.insertId }, 200);
}
});
});
req.pipe(busboy);
});
app.listen(3000, () => console.log('Server started on port 3000'));
在这个例子中,我们使用Busboy
来解析请求体中的文件流。每当接收到文件数据时,我们更新progress
变量,并可以在控制台中看到当前的进度。对于实际的进度通知,你可能需要通过WebSocket或其他机制将这些更新推送到客户端。
注意:上述代码仅展示了如何计算文件上传的进度。要将此进度信息发送回iOS客户端,你需要实现额外的通信逻辑(例如,通过WebSocket、轮询或事件源)。
要在Node.js中实现文件上传的进度显示,并将进度信息传递给iOS应用,你可以使用busboy
或multer
等中间件来处理文件上传,并通过WebSocket或其他实时通信技术(如Server-Sent Events)将进度更新推送给客户端。
这里提供一个使用busboy
和WebSocket的简单示例:
- 安装必要的库:
npm install busboy ws
- 示例代码:
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const busboy = require('busboy');
const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
console.log('Client connected');
ws.on('message', (message) => {
console.log('Received: %s', message);
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
app.post('/event', (req, res) => {
const bb = busboy({ headers: req.headers });
bb.on('file', (fieldname, file, filename, encoding, mimetype) => {
let uploadedBytes = 0;
file.on('data', (data) => {
uploadedBytes += data.length;
// 发送进度到所有连接的客户端
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({ progress: (uploadedBytes / file.size) * 100 }));
}
});
});
file.on('end', () => {
const newPath = __dirname + '/uploads/' + filename;
file.pipe(fs.createWriteStream(newPath));
});
});
bb.on('finish', () => {
res.send({ message: 'Upload finished' });
});
req.pipe(bb);
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
在这个例子中,我们使用busboy
来处理文件上传,并监听文件上传的数据事件来计算上传进度。每当接收到数据时,我们会通过WebSocket将当前进度发送给所有已连接的客户端。这样,你的iOS应用就可以接收这些进度更新并在UI上显示上传进度了。
确保在iOS端也实现了相应的WebSocket连接来接收这些消息。