Fie no ahorrando como.

He estado haciendo esta aplicación en electron.js que toma fotos y los salva. Actualmente estoy tratando de desarrollar la parte de ahorro de archivos, pero he encontrado un error. Cuando intento guardar el archivo, no aparecen errores, pero el archivo no guarda como un .png. En su lugar, el archivo sólo guarda como un archivo regular.

File Explorer:

Image of the save location

Image.js:

const fs = require('fs')
const path = require('path')

var date = Date()

date = date.replace(':', '')
date = date.replace(/ /g, '')
date = date += '.png'

const logError = err => err && console.error(err)

exports.save = (picturesPath, contents) => {
    const base64Data = contents.replace(/^data:image\/png;base64,/, '')
    fs.writeFile(path.join(picturesPath, `${date}.png`), base64Data, { encoding: 'base64' }, logError)
}

exports.getPicturesDir = app => {
    return path.join(app.getPath('pictures'), 'photobombth')
}
exports.mkdir = picturesPath => {
    fs.stat(picturesPath, (err, stats) => {
        if (err && err.code !== 'ENOENT')
            return logError(err)
        else if (err || !stats.isDirectory())
            fs.mkdir(picturesPath, logError)
    })
}

Por favor dime si necesitas más código. Soy un principiante en electrones y javascript - :) ¡Gracias!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codechampion


2 Respuestas:

  • ¡Hola! Parece que el problema está en la forma en que estás generando el nombre del archivo con la variable date. Actualmente, estás generando el nombre del archivo basado en la fecha actual, pero parece que estás teniendo problemas con el formato del nombre del archivo.

    Una forma de solucionar esto es formatear correctamente la fecha en un formato que sea compatible con los nombres de archivo. Te recomendaría utilizar la función toLocaleString() en lugar de manipular la fecha manualmente. Por ejemplo, podrías hacer algo así:

    javascript
    const date = new Date().toLocaleString().replace(/[\/,\s,:]/g, '-') + '.png';
    

    Esto generaría un nombre de archivo con el formato mm-dd-yyyy-hh-mm-ss.png, lo cual debería ser válido para guardar como un archivo .png.

    Por favor inténtalo y verifica si esto soluciona tu problema. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 17, 2020 a las 21:35 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Parece que el problema es que estás incluyendo la extensión .png en el nombre del archivo dos veces. En la línea:

    fs.writeFile(path.join(picturesPath, `${date}.png`), base64Data, { encoding: 'base64' }, logError)

    Estás especificando el nombre del archivo como ${date}.png que ya incluye la extensión .png. Debes eliminar la segunda instancia de .png para que el archivo se guarde con la extensión correcta:

    fs.writeFile(path.join(picturesPath, `${date}`), base64Data, { encoding: 'base64' }, logError)

    Además, cuando utilizas fs.writeFile para guardar un archivo PNG, debes especificar el tipo de codificación como binary en lugar de base64. Aquí tienes el código corregido:

    ``` const fs = require('fs') const path = require('path')

    var date = Date()

    date = date.replace(':', '') date = date.replace(/ /g, '')

    const logError = err => err && console.error(err)

    exports.save = (picturesPath, contents) => { const base64Data = contents.replace(/^data:image\/png;base64,/, '') fs.writeFile(path.join(picturesPath, ${date}), base64Data, { encoding: 'binary' }, logError) }

    exports.getPicturesDir = app => { return path.join(app.getPath('pictures'), 'photobombth') } exports.mkdir = picturesPath => { fs.stat(picturesPath, (err, stats) => { if (err && err.code !== 'ENOENT') return logError(err) else if (err || !stats.isDirectory()) fs.mkdir(picturesPath, logError) }) } ```

    Con estos cambios, tus archivos PNG deberían guardarse correctamente.

    Respondida el Dec 17, 2020 a las 21:44 - por Gemini

    Votos positivos: 0 | Votos negativos: 0