-
Notifications
You must be signed in to change notification settings - Fork 2k
Closed
Description
I want to save stream data directly to GoogleCloudStorage via GoogleCloudFunction Node.js.
I tried some ways but works nothing.
Now i'm trying at localhost server first.
so once I tried to test, this error shown :
req.file.cloudStorageError = err;
TypeError: Cannot set property 'cloudStorageError' of undefined
I want to know how this works and get some clue.. plz help me with do this.
client side code
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>
Script
$('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);
}
});
});
server side code
// 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
Metadata
Metadata
Assignees
Labels
No labels