我正在使用angularjs,nodejs和socketio進行通信。文件沒有通過socket.io發送
客戶端HTML:
<div style='height: 0px;width: 0px; overflow:hidden;'>
<input id="avatarInput" type="file" value="upload" onchange="angular.element(this).scope().upload(this)" />
</div>
<button data-ng-click="avatarButton()">Upload image</button>
客戶端JS:
$scope.avatarButton = function() {
document.getElementById('avatarInput').click();
}
$scope.upload = function (file) {
console.log('client: ' + file.type);
socket.emit('image', {
file: file
});
}
上述結果輸出:client: file
當我選擇一個.png
要打開的文件。
服務器的NodeJS:
.on('image', function (data) {
console.log('server: ' + data.file.type);
})
上述結果在輸出:server: undefined
。
我猜這個文件沒有通過socket.io發送到服務器。我在這裏看不到錯誤。更多的文檔在這裏:http://socket.io/blog/introducing-socket-io-1-0/#binary
從文檔報價:
Socket.IO現在支持發射緩衝器(來自Node.js的),斑點, ArrayBuffer甚至文件,因爲任何數據結構的一部分:
工作代碼:
客戶端HTML:
<div style='height: 0px;width: 0px; overflow:hidden;'>
<input id="avatarInput" type="file" value="upload" onchange="angular.element(this).scope().upload(this.files)" />
</div>
<button data-ng-click="avatarButton()">Upload image</button>
客戶端JS:
$scope.avatarButton = function() {
document.getElementById('avatarInput').click();
}
$scope.upload = function (files) {
if (window.File && window.FileReader && window.FileList && window.Blob) {
socket.emit('uploadAvatar', {
file: files[0]
});
} else {
alert('The File APIs are not fully supported in this browser.');
}
}
服務器的NodeJS:
.on('uploadAvatar', co.wrap(function* (data) {
console.log(data.file); // spits out buffer
var fs = require('fs');
fs.writeFile(__dirname + '/public/avatar/myFile.png', data.file, {
flag: "w"
}, function (err) {
if (err)
return console.log(err);
console.log("The file was saved!");
});
}))
'angular.element(本).scope( ).upload(this)'你爲什麼這樣做? –
@MartijnWelker這是一種巧妙的方式,可以設置「按鈕」的樣式,並使其像表單/文件輸入一樣。純粹爲了演出。例如,爲IE設計樣式文件輸入是一件痛苦的事情。 –
不應該使用'FileReader'的實例來發送blob嗎? – maurycy