Necesito cargar un archivo .doc o .docx en Google Drive usando Google Drive API v3 y luego convertirlo también usando Google Drive API v3 para que el contenido del archivo sea legible y editable en mi propia aplicación web (alojada en node. js). Intenté hacer esto usando drive.files.copy, sin embargo, seguí recibiendo el error: La API devolvió un error: Error: No se admite la conversión del contenido cargado al tipo de salida solicitado. ¿Alguien puede ayudarme a averiguar cómo hacer esto? Cualquier ayuda será apreciada. ¡Gracias!
Aquí está el código que usé para convertir, sin embargo, no funciona:
drive.files.list({ q: "mimeType = 'application/msword'" pageSize: 100, fields: 'nextPageToken, files(id, name)', }, (err, res) => { if (err) return console.log('The API returned an error: ' + err); const files = res.data.files; if (files.length) { console.log('Files:'); files.map((file) => { let result = (file.name).substring(0, (file.name).indexOf('.')); console.log(file); console.log(`${file.name} (${file.id})`); drive.files.copy( { fileId: file.id, requestBody: { name: result, mimeType: 'application/vnd.google-apps.document' } }, (err, res) => { if (err) return console.log("The API returned an error: " + err); console.log(res.data); } ); }); }else { console.log('No files found.'); } });Aquí está el código que usé para cargar el archivo:
const driveResponse = drive.files.create({ requestBody: { name: filename, mimeType: mimetype }, media: { mimeType: mimetype, body: Buffer.from(data).toString() } }); driveResponse.then(data => { if(data.status == 200) res.redirect('/notes'); else console.log("file not uploaded."); }).catch(err => { throw new Error(err) })Cuando vi su secuencia de comandos para cargar el archivo de application/msword , noté un punto de modificación. Entonces, ¿qué tal la siguiente modificación? En este caso, se requiere convertir al tipo de flujo.
Además, confirmé que cuando probé buffer.toString() como el cuerpo de media , el archivo cargado no era válido.
const { Readable } = require("stream"); const stream = new Readable(); stream.push(Buffer.from(data)); stream.push(null); const driveResponse = drive.files.create({ requestBody: { name: filename, }, media: { body: stream } }); driveResponse.then(data => { if(data.status == 200) res.redirect('/notes'); else console.log("file not uploaded."); }).catch(err => { throw new Error(err) })Buffer.from(data) es el valor válido como application/msword . Entonces, si el valor de Buffer.from(data) no es válido como application/msword , verifique los datos nuevamente.