IT TIP

로컬 서버에 이미지 쓰기

itqueen 2020. 12. 6. 22:28
반응형

로컬 서버에 이미지 쓰기


최신 정보

받아 들여진 대답은 작년에 좋았지 만 오늘은 다른 사람들이 사용하는 패키지를 사용할 것입니다 : https://github.com/mikeal/request


실물

Google의 로고를 잡고 node.js를 사용하여 서버에 저장하려고합니다.

이것은 내가 지금 가지고 있으며 작동하지 않습니다.

        var options = {
            host: 'google.com',
            port: 80,
            path: '/images/logos/ps_logo2.png'
        };

        var request = http.get(options);

        request.on('response', function (res) {
            res.on('data', function (chunk) {
                fs.writeFile(dir+'image.png', chunk, function (err) {
                    if (err) throw err;
                    console.log('It\'s saved!');
                });
            });
        });

이 작업을 어떻게 할 수 있습니까?


여기에서 몇 가지 일이 발생합니다.

  1. fs / http가 필요하다고 가정하고 dir 변수를 설정합니다. :)
  2. google.com은 www.google.com으로 리디렉션하므로 이미지가 아닌 리디렉션 응답의 본문을 저장합니다.
  3. 응답이 스트리밍됩니다. 이는 '데이터'이벤트가 한 번이 아니라 여러 번 발생 함을 의미합니다. 전체 응답 본문을 얻으려면 모든 청크를 저장하고 결합해야합니다.
  4. 바이너리 데이터를 받고 있기 때문에 응답 및 writeFile에 따라 인코딩을 설정해야합니다 (기본값은 utf8).

이것은 작동합니다.

var http = require('http')
  , fs = require('fs')
  , options

options = {
    host: 'www.google.com'
  , port: 80
  , path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){
    var imagedata = ''
    res.setEncoding('binary')

    res.on('data', function(chunk){
        imagedata += chunk
    })

    res.on('end', function(){
        fs.writeFile('logo.png', imagedata, 'binary', function(err){
            if (err) throw err
            console.log('File saved.')
        })
    })

})

이 스레드는 오래되었지만 https://github.com/mikeal/request 패키지로 동일한 작업을 수행하고 싶었습니다 .

여기에 작동 예

var fs      = require('fs');
var request = require('request');
// Or with cookies
// var request = require('request').defaults({jar: true});

request.get({url: 'https://someurl/somefile.torrent', encoding: 'binary'}, function (err, response, body) {
  fs.writeFile("/tmp/test.torrent", body, 'binary', function(err) {
    if(err)
      console.log(err);
    else
      console.log("The file was saved!");
  }); 
});

리디렉션도 관리 할 수 있도록 http-request 를 사용하는 것이 좋습니다 .

var http = require('http-request');
var options = {url: 'http://localhost/foo.pdf'};
http.get(options, '/path/to/foo.pdf', function (error, result) {
    if (error) {
        console.error(error);
    } else {
        console.log('File downloaded at: ' + result.file);
    }
});

이건 어때?

var http = require('http'), 
fs = require('fs'), 
options;

options = {
    host: 'www.google.com' , 
    port: 80,
    path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){

//var imagedata = ''
//res.setEncoding('binary')

var chunks = [];

res.on('data', function(chunk){

    //imagedata += chunk
    chunks.push(chunk)

})

res.on('end', function(){

    //fs.writeFile('logo.png', imagedata, 'binary', function(err){

    var buffer = Buffer.concat(chunks)
    fs.writeFile('logo.png', buffer, function(err){
        if (err) throw err
        console.log('File saved.')
    })

})

나는 사용하는 더 쉬운 해결책이 있습니다 fs.readFileSync(./my_local_image_path.jpg)

Azure Cognative Services의 Vision API 에서 이미지를 읽기위한 것입니다.

const subscriptionKey = 'your_azure_subscrition_key';
const uriBase = // **MUST change your location (mine is 'eastus')**
    'https://eastus.api.cognitive.microsoft.com/vision/v2.0/analyze';

// Request parameters.
const params = {
    'visualFeatures': 'Categories,Description,Adult,Faces',
    'maxCandidates': '2',
    'details': 'Celebrities,Landmarks',
    'language': 'en'
};

const options = {
    uri: uriBase,
    qs: params,
    body: fs.readFileSync(./my_local_image_path.jpg),
    headers: {
        'Content-Type': 'application/octet-stream',
        'Ocp-Apim-Subscription-Key' : subscriptionKey
    }
};

request.post(options, (error, response, body) => {
if (error) {
    console.log('Error: ', error);
    return;
}
let jsonString = JSON.stringify(JSON.parse(body), null, '  ');
body = JSON.parse(body);
if (body.code) // err
{
    console.log("AZURE: " + body.message)
}

console.log('Response\n' + jsonString);

request를 사용하여 이미지를 로컬에 저장하는 가장 깨끗한 방법 :

const request = require('request');
request('http://link/to/your/image/file.png').pipe(fs.createWriteStream('fileName.png'))

헤더 에 인증 토큰추가 해야하는 경우 다음을 수행하십시오.

const request = require('request');
request({
        url: 'http://link/to/your/image/file.png',
        headers: {
            "X-Token-Auth": TOKEN,
        }
    }).pipe(fs.createWriteStream('filename.png'))                    

참고 URL : https://stackoverflow.com/questions/5294470/writing-image-to-local-server

반응형