我正试着在某个Google驱动器文件夹上发送一个音频文件。为了成功,我会在发送文件之前转换文件中的blob。自启动以来,我收到一个错误:
错误:找不到文件。代码: 404,错误:{域:‘全局’,原因:‘未找到’,消息:‘找不到文件: 1aazd544z3FOCAsdOA5E7XcOaS3297sU.',locationType:’参数‘,位置:'fileId’}}
渐进式编辑:到目前为止,我已经将我的音频斑点转换为base64字符串,以简化我的斑点的处理。
但是,我总是不能用我的base64音频blob写一个文件:
这是我的driveApi.js:
// request data from req.body
var data = req.body.data ; // data variable is presented in form of base64 string
var name = req.body.word ;
(...)
// WRITE FILE AND STORE IT IN BODY HEADER PROPERTY
body: fs.writeFile((name + ".mp3"), data.substr(data.indexOf(',')+1), {encoding: 'base64'}, function(err) {
console.log('File created')
})
发布于 2018-06-08 05:55:13
有三个步骤:使用drive.files.create函数中的base64数据创建一个临时文件,然后为该文件指定一个特定的名称-e.g。tempFile,您还可以使用时间值自定义此名称。之后,通过一个"fs.createReadStream“方法将该文件上传到Google drive上。
一些提示:
首先-使用path.join(__dirname,name + "-“+ Date.now() +".ext”)创建文件名
Secondly 异步执行此过程,以避免数据流冲突(尝试在创建文件之前创建文件),因此请在设置fs.writeFile函数后调用drive.files.create。
Thirdly 在操作完成后销毁tempFile。它允许您自动执行该过程。
我让你深入研究你需要的方法。但从根本上讲,fs应该可以完成这项工作。
同样,要小心数据流,并使用回调来控制它。你的代码可能会崩溃,仅仅因为函数以一种非操作的方式运行。一些链接:
https://nodejs.org/api/path.html https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback
下面是一个实例:
// datavalue = some time value
fs.writeFile(
path.join(__dirname, name + "-" + datevalues +".mp3" ),
data.substr(data.indexOf(',')+1),
{encoding: 'base64'},
// callback
function(err) {
if(err){ console.log("error writting file : " + err)}
console.log('File created')
console.log("WRITTING") // control data flow
fileCreate(name)
})
function fileCreate (name){
// upload file in specific folder
var folderId = "someID";
var fileMetadata = {
'name': name + ".mp3" ,
parents: [folderId]
}; console.log("MEDIA") // control data flow
var media = {
mimeType: 'audio/mp3',
body: fs.createReadStream(path.join(__dirname, name + "-" + datevalues +".mp3" ))
};
drive.files.create({
auth: jwToken,
resource: fileMetadata,
media: media,
fields: 'id'
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
}
// make a callback to a deleteFile() function // I let you search for it
});
}
发布于 2018-06-07 10:54:13
这个修改怎么样?我不确定来自reactApp.js的blob
的情况。所以你能试着使用这个修改吗?在此修改中,使用来自reactApp.js的file
或blob
。
修改后的脚本:
var stream = require('stream'); // Added
module.exports.uploadFile = function(req){
var file ;
console.log("driveApi upload reached")
function blobToFile(req){
file = req.body.blob
//A Blob() is almost a File() - it's just missing the two properties below which we will add
file.lastModifiedDate = new Date();
file.name = req.body.word;
return file;
}
var bufStream = new stream.PassThrough(); // Added
bufStream.end(file); // Or bufStream.end(### blob from reactApp.js ###) Added
console.log(typeof 42);
// upload file in specific folder
var folderId = "1aa1DD993FOCADXUDNJKLfzfXcOaS3297sU";
var fileMetadata = {
"name": req.body.word,
parents: [folderId]
}
var media = {
mimeType: "audio/mp3",
body: bufStream // Modified
}
drive.files.create({
auth: jwToken,
resource: fileMetadata,
media: media,
fields: "id"
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log("File Id: ", file.id);
}
console.log("driveApi upload accomplished")
});
}
如果这不起作用,我很抱歉。
https://stackoverflow.com/questions/50729797
复制相似问题