目標は次のとおりです。
- ブラウザからファイルをアップロードできる
- アップロードを S3 に直接ストリーミングできる
- アップロードの進行状況をブラウザに中継する
これを理解するのにしばらく時間がかかりました(そして、StackOverflowで3つすべてを実行するための答えがまだ見つかりませんでした)ので、他の誰かが同じ問題を抱えている場合に備えて私の答えを投稿してください。
私はより良い解決策への提案を受け入れています(私の速度はかなりひどいです)。
目標は次のとおりです。
これを理解するのにしばらく時間がかかりました(そして、StackOverflowで3つすべてを実行するための答えがまだ見つかりませんでした)ので、他の誰かが同じ問題を抱えている場合に備えて私の答えを投稿してください。
私はより良い解決策への提案を受け入れています(私の速度はかなりひどいです)。
フロントエンド HTML について
<input type="file" class="file" name="files[]">
フロントエンド JS について
require('blueimp-file-upload');
var socket = require('socket.io-client');
var fileSize;
var socketId;
// Socket will be used to transmit the percent uploaded from server
socket.connect()
// when the socket gives us a unique ID we will save it so that we
// can identify the client
.on('id', function (data) {
socketId = data;
})
.on('uploadProgress', function (data){
// you can show a progress bar with this percentage
var pct = data.loaded / fileSize;
});
$('.file')
.change(function (){
// save the file size so that we can calculate perfectage
fileSize = this.files[0].size;
})
.fileupload({
dataType: 'json',
})
.fileupload('option', {
url: '/upload?socketId=' + socketId
});
サーバー上
var Busboy = require('busboy');
var AWS = require('aws-sdk');
var socket = require('socket.io');
var express = require('express');
var http = require('http');
// Set up Express
var app = express();
var server = http
.Server(app)
.listen(80);
var io = socket(server);
// keeps track of all the open sockets
var sockets = {};
io.on('connection', function (socket) {
var uniqueId = _.random(0, 100000000);
app.socket[uniqueId] = socket;
socket.emit('id', uniqueId);
});
// Set up upload route
app.post('/upload', function (req, res) {
AWS.config.update({
appKey: '',
jsKey: '',
});
var s3 = new AWS.S3();
var busboy = new Busboy({
headers: req.headers
});
busboy.on('file', function(fieldname, file, filename) {
s3.upload({
Bucket: 'bucketname',
Key: new Date().getTime() + filename,
Body: file //stream
}, function(err, file){
res.json({
success: true
});
}).on('httpUploadProgress', function(evt) {
//emit progress
sockets[req.query.socketId].emit('uploadProgress', evt);
});
});
req.pipe(busboy);
});