Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to download images from the database?

I need to upload files and images no larger than 2 megabytes in the database. But there is a problem downloading images. All images that are downloaded break and do not open. No such problems with text files.

Result of the downloaded image:

file 2.png

2.png: data

Uploading images this way:

module.exports.upload = async function (req, res) {
  const sysFileObj = {
    COMMENTS: req.body.COMMENTS,
    NAME: req.file.originalname,
    MIMETYPE: req.file.mimetype,
    FILE_CONTENT: req.file.buffer
  };
  try {
    await SysFiles.create(sysFileObj);
    res.status(201).json(sysFileObj);
  } catch (e) {
    errorHandler(res, e);
  }
};

multer:

const multer = require('multer');

const storage = multer.memoryStorage()

let obj = {
    storage: storage,
    limits: {
        fileSize: 1024 * 1024 * 2 
    }
};

var upload = multer(obj)

module.exports = upload;

And here there is a problem when download:

module.exports.download = async function (req, res) {
  try {
    let sysFile = await SysFiles.findById(req.params.SYSFILE_ID);
    var fileContents = Buffer.from(sysFile._props.FILE_CONTENT);
    var readStream = new stream.PassThrough();
    readStream.end(fileContents);
    res.set('Content-disposition', 'attachment; filename=' + sysFile._props.NAME);
    res.set('Content-Type', sysFile._props.MIMETYPE);
    readStream.pipe(res);
  } catch (e) {
    errorHandler(res, e);
  }
};

What am I doing wrong? Please tell me. I must say right away that I need to upload the image to the database without any links to any folder where the images will be stored.

Note:

But, by the way, when I downloaded the uploaded image using “SQL Developer”, the image opens without any not problems.

like image 883
user12094588 Avatar asked Sep 30 '19 04:09

user12094588


1 Answers

You must store image content-Type And image data

const formidable  = require('formidable');
const _  = require('lodash');
const fs = require('fs');
// loading formidable library
let form = new formidable.IncomingForm();
// taking file extension
form.keepExtensions = true;
//processing for upload image
form.parse(request_data,(err,fields,files) => {
    //if error when uploading image
    if (err) {
        return res.status(400).json({
            err: 'Image could not bd uploaded'
        })
    }
    // validating all fields without image
    const {name, description, price, category, quantity, shipping} = fields;
    if(!name || !description || !price || !category || !quantity || !shipping) {
        return res.status(400).json({
            err: 'All Fields are required'
        })
    }
    // lets continue when there are no error
    // form have available photo
    if(files.photo){
        //1 kb = 1000
        //1 MB = 1000000
        // check image size
        if(files.photo.size > 2000000){
            return res.status(400).json({
                err: 'Image should be less than 2 MB'
            })
        }
        // there are no error found then execute it
        TAKING_AS_YOUR_VALRIABLE.data = fs.readFileSync(files.photo.path);
        TAKING_AS_YOUR_VALRIABLE.contentType = files.photo.type
    }
    // finaly save product
    //save it your own way

    const FINAL_DATA = {...fields,...TAKING_AS_YOUR_VALRIABLE}
})

now show photo code

if(TAKING_AS_YOUR_VALRIABLE.data){
    res.set('Content-Type',TAKING_AS_YOUR_VALRIABLE.contentType);
    res.send(TAKING_AS_YOUR_VALRIABLE.data);
}
like image 135
MUKUL HOSEN Avatar answered Jan 03 '23 16:01

MUKUL HOSEN