Node.js: для сохранения потоковых данных непосредственно в GoogleCloudStorage через GoogleCloudFunction
Я хочу сохранить потоковые данные непосредственно в GoogleCloudStorage через GoogleCloudFunction Node.js.
Я попробовал GoogleCloudPlatform / nodejs-Getting-Start, но ничего не работает.
Теперь я пытаюсь на локальном сервере в первую очередь.
поэтому, как только я попытался проверить, эта ошибка показала: req.file.cloudStorageError = err;
TypeError: Cannot set property 'cloudStorageError' of undefined
Я хочу знать, как это работает, и получить некоторую подсказку.. Пожалуйста, помогите мне сделать это.
код на стороне клиента
HTML
<form data-brackets-id='37' action="http://localhost:8989/fileupload" method="post" enctype="multipart/form-data" name="">
<input data-brackets-id='38' type="file" name="file" id="file" value="">
<input data-brackets-id='39' type="button" data-inline="true" value="Input" id="filesubmit">
</form>
скрипт
$('form #filesubmit').on('click', (e)=>{
var uploadfile = $("input[name=file]")[0].files[0];
var formData = new FormData();
formData.append("myfile", $("input[name=file]")[0].files[0]);
console.log('uploadfile', uploadfile, uploadfile.type);
var googleCloud = 'https://us-central1-xxxx-xxxxx.cloudfunctions.net/functionNm';
var localurl = 'http://localhost:8989/fileupload'
$.ajax({
url: localurl, // googleCloud
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
console.log('response data', data);
}
});
});
код на стороне сервера
// start form
var Storage = require('@google-cloud/storage');
var multiparty = require('multiparty');
var fs = require('fs');
var form = new multiparty.Form();
const storage = Storage({
projectId: [My Project ID]
});
const bucket = storage.bucket('multilang_service');
function getPublicUrl (filename) {
return `https://storage.googleapis.com/${CLOUD_BUCKET}/${filename}`;
}
// get field name & value
form.on('field',function(name,value){
console.log('[?] normal field / name = '+name+' , value = '+value);
});
// file upload handling
form.on('part',function(part){
var filename;
var size;
if (part.filename) {
filename = part.filename;
size = part.byteCount;
}else{
part.resume();
}
const gcsname = Date.now() + filename;
const file = bucket.file(gcsname);
const stream = file.createWriteStream({
metadata: {
contentType: part.headers['content-type']
}
});
stream.on('error', (err) => {
req.file.cloudStorageError = err;
next(err);
});
stream.on('finish', () => {
req.file.cloudStorageObject = gcsname;
file.makePublic().then(() => {
req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
next();
});
});
stream.end(form);
part.on('data',function(chunk){
console.log('[2] '+filename+' read '+chunk.length + 'bytes');
});
part.on('end',function(){
console.log('[4] '+filename+' Part read complete');
});
});
// track progress
form.on('progress',function(byteRead,byteExpected){
console.log('[3] Reading total '+byteRead+'/'+byteExpected);
});
// all uploads are completed
form.on('close',function(){
res.send('done for test');
});
form.parse(req);
// end form