Estoy tratando de escribir un lienzo de datos con node.js fs.writeFile como un binario. Archivo JPEG, pero después de que el archivo es escrito, se puede ver que el archivo se almacena como texto sin formato, no de datos binarios.

Este es un ejemplo de la data enviados desde el cliente de mi nodo, en representación de la imagen JPEG de datos (sólo un par de primeros caracteres):

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...

Que estoy recibiendo este data en el lado del cliente mediante la realización de:

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')

Aquí es el uso de función en mi node.js servidor:

fs.writeFile('../some.jpeg', data, 'binary', function(err){});

Lugar del archivo que se está escrita como binario (״״ JFIF ...), se escribe exactamente los datos recibidos desde el cliente.

¿Qué estoy haciendo mal aquí?

  • stackoverflow.com/a/6933413/1746830
  • gist.github.com/madhums/e749dca107e26d72b64d Otro enfoque…
  • Gracias, estoy mirando a través de tu 1er comentario
  • He cambiado a fs.writeFile('../some.jpeg', data, 'base64', function(err){}); pero todavía se escribe como la misma cadena que ha recibido.
  • var buf = new Buffer(data, 'base64'); fs.writeFile('image.png', buf); funciona ! Por favor publica esto como una respuesta para que yo pueda rep usted.
  • Yo estaba a punto de sugerir más adelante opción… Feliz ayudó…
  • stackoverflow.com/a/6926804/1746830 sugiere el mismo enfoque.. creo que debe ser marcado como un incauto…

InformationsquelleAutor Koby Douek | 2017-04-19

3 Comentarios

  1. 28

    JavaScript lenguaje había ningún mecanismo para la lectura o manipulación de flujos de datos binarios. El Buffer clase fue introducido como parte de la Node.js API para hacer posible interactuar con el octeto de corrientes en el contexto de las cosas, como flujos TCP y operaciones del sistema de archivos.

    Puro javascript, mientras que con unicode-encoded cadenas, no controla directamente los datos binarios muy bien.

    Al escribir grandes cantidades de datos a un socket, es mucho más eficiente que los datos en binary formato, frente a tener que convertir de unicode.

    var fs = require('fs');
    //string generated by canvas.toDataURL()
    var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0"
        + "NAAAAKElEQVQ4jWNgYGD4Twzu6FhFFGYYNXDUwGFpIAk2E4dHDRw1cDgaCAASFOffhEIO"
        + "3gAAAABJRU5ErkJggg==";
    //strip off the data: url prefix to get just the base64-encoded bytes
    var data = img.replace(/^data:image\/\w+;base64,/, "");
    var buf = new Buffer(data, 'base64');
    fs.writeFile('image.png', buf);

    Referencia

    • Rayón, Este funciona a la perfección. Gracias por toda su ayuda, la paz y el amor de Israel.
    • – Me alegro de que ayudó a! Feliz Codificación
    • «javascript Puro… no controla directamente los datos binarios muy bien.» — no entiendo esta respuesta, dado que este es un reciente Q&A. ¿se pierda por completo TypedArrays y ArrayBuffer? Datos binarios no es un problema de Javascript, y si bien es «bastante nuevo» no es exactamente que nuevo. .developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays
    • Me refería que la declaración de aquí
    • Que es a partir de 2011. Me remito a mi comentario anterior.
    • Trabajo como un encanto! Thx
    • guarda mi tiempo!! saludos
    • Usted señor, son un ahorro de tiempo! ^_^

  2. 4

    He tenido la pregunta en cuestión. He resuelto el problema de cuando hice el valor por defecto null de «codificación» en la «petición» de la biblioteca

    var request = require("request").defaults({ encoding: null });
    var fs = require("fs");
    
    fs.writeFile("./image.png", body, function(err) {
        if (err) throw err;
    });
    • Me estaba descargando un archivo de imagen mediante un enlace y require("request").defaults({ encoding: null }); resuelto mi día a día. Pero, la respuesta se puede mejorar un poco más.
  3. 0

    En lugar de escribir el archivo directamente a su cliente, en primer lugar, pedir al servidor para enviar
    imágenes en formato binario.

       let request= {
            headers: {
                'Content-Type': 'image/jpeg',
                'Authorization': "your token"
            },
            encoding:'binary'
        };
         request.get(url,request,(error, response, body)=>{
            if(error){
                console.log('error in get photo',error)
                return "default image to server";  
            }else{
                if(response.statusCode == 200){ 
    
          Fs.writeFile('path',body,'binary',function(err){
                        if(err){
                            return "your message";   
                        }else{
                            return "success";
                        }
                    })
                }else{
                    console.log('error in get photo 3')
                    return "your message";  
                }
            }
        })

Dejar respuesta

Please enter your comment!
Please enter your name here