2017-01-26 2 views
0

У меня есть экспресс-сервер, работающий с следующему маршруту:Скачать изображение от экспресс-маршрут

exports.getUserFile = function (req, resp) { 
     let filePath = path.join(__dirname, 'storage', req.params.fileName); 
     resp.download(filePath); 
    }); 
} 

В моем веб-приложение, я звоню по этому пути и пытается сохранить файл локально с помощью file-saver:

let req = request.get('/users/' + userId + '/files/' + file.name); 
req.set('Authorization', 'Bearer ' + this.state.jsonWebToken); 
req.end((err, resp) => { 
    let f = new File([resp.text], file.name, {type: resp.type}); 
    fileSaver.saveAs(f); 
}); 

Если файл является простым текстом, он работает нормально, но для других типов файлов, таких как изображения, я не могу открыть файл (он «поврежден»).

Это то, что ответ выглядит следующим образом:

screenshot

мне нужно декодировать данные в некотором роде первый ли? Каков правильный способ сохранения содержимого файла?

ответ

1

Если вы используете superagent для выполнения запросов, вы можете явно задать тип ответа "blob", что предотвратит любые попытки декодирования данных ответа. Двоичные данные будут в конечном итоге в resp.body:

req.responseType('blob').end((err, resp) => { 
    saveAs(resp.body, file.name); 
}); 
1

Я не использовал экспресс в течение длительного времени, и я набираю текст с мобильного телефона, это похоже на проблему с кодировкой, поэтому кажется, что вы являетесь отправкой необработанного изображения, вам нужно будет закодировать его в base64 try что-то вроде:

//Here your saved file needs to be encoded to base 64. 
var img = new Buffer(data, 'base64'); 

    res.writeHead(200, { 
    'Content-Type': 'image/png', 
    'Content-Length': img.length 
    }); 
    res.end(img); 

Где данные сохраненного изображения, если вы можете сделать изображение, которое вы только добавить заголовки для загрузки или просто способ загрузки цепи.

1

Если вы хотите, чтобы загрузить изображение в качестве вложения на странице вы можете использовать Рез

exports.getUserFile = function (req, resp) { 
    let filePath = path.join(__dirname, 'storage', req.params.fileName); 
    var check = fs.readFileSync(__dirname+req.params.fileName); 
    resp.attachment(req.params.fileName); // The name of the file to be saved as. Eg Picture.jpg 
    res.resp(check) // Image buffer read from the path. 
}); 
} 

Ссылка:

http://expressjs.com/en/api.html#res.attachment

http://expressjs.com/en/api.html#res.end

Надеюсь, это поможет.

Смежные вопросы