2012-09-22 2 views
1

내 node.js 서버에 다른 서버에서 파일을 다운로드하고 있습니다. 다운로드 한 파일은 Base64로 2 번 인코딩 된 JPG 이미지 데이터로 2 번 디코드해야합니다. 내 코드가 주어진다. 나는 그것을 디코딩 할 때Node.JS로 JPG 파일 만들기

var base64DecodedFileData = new Buffer(file_data, 'base64').toString('binary'); 
var tmp = base64DecodedFileData.split("base64,"); 
var base64DecodedFileData = new Buffer(tmp[1], 'base64').toString('binary');                           
var file = fs.createWriteStream(file_path, stream_options); 
file.write(base64DecodedFileData); 
file.end(); 

나는 (내가 그것을 두 번째 시간을 디코딩하여 온라인 Base64로 디코더의 데이터가 나는 적절한 이미지를 가지고 있다는 것을 확인했다) 내 이미지 데이터 내가 그것을 디코딩이 처음 유효 알고 있지만, 두 번째로이 데이터로 파일을 만듭니다. 유효한 JPG 파일을 얻지 못했습니다.

실제 이미지와 비교해 보았지만 두 파일의 시작과 끝이 잘된 것처럼 보였지만 내 구성 파일에서 뭔가 잘못되었습니다. 생성 된 파일은 원본 파일보다 크기가 큽니다.

PS : I가 제 복호 후의 데이터

데이터로 시작하기 때문에 제 시간에 복호화 전에 분할을 수행하고있다 :; base64, DATASTARTS

모든 의견. Farrukh Arshad.

+0

그냥 명확히하기 위해 - 두 번 인코딩되는 이유는 무엇입니까? – DeadAlready

+0

그것은 (파일을 다운로드하는 곳의) 서버가 파일을 업로드하는 방식 일뿐입니다. –

답변

0

내 문제가 해결되었습니다. 문제는 node.js의 디코딩에있는 것처럼 보이므로 작업을 수행 할 C++ 애드온을 작성했습니다. 여기에 코드가 있습니다. 이미지 파일을 한 번만 인코딩하면 문제가 해결 될 것이라고 확신합니다.

의 .js는

ModUtils.generateImageFromData (file_data,를 file_path) 파일;

C++ 부가 기능 :이 http://www.adp-gmbh.ch/cpp/common/base64.html

#define BUILDING_NODE_EXTENSION 
#include <node.h> 
#include <iostream> 
#include <fstream> 
#include "base64.h" 

using namespace std; 
using namespace v8; 

static const std::string decoding_prefix = 
"data:;base64,"; 

// -------------------------------------------------------- 
// Decode the image data and save it as image 
// -------------------------------------------------------- 
Handle<Value> GenerateImageFromData(const Arguments& args) { 
HandleScope scope; 

// FIXME: Improve argument checking here. 
// FIXME: Add error handling here. 

if (args.Length() < 2) return v8::Undefined(); 

Handle<Value> fileDataArg = args[0]; 
Handle<Value> filePathArg = args[1]; 
String::Utf8Value encodedData(fileDataArg); 
String::Utf8Value filePath(filePathArg); 
std::string std_FilePath = std::string(*filePath); 

// We have received image data which is encoded with Base64 two times 
// so we have to decode it twice. 
std::string decoderParam = std::string(*encodedData); 
std::string decodedString = base64_decode(decoderParam); 

// After first decoding the data will also contains a encoding prefix like 
    // data:;base64, 
// We have to remove this prefix to get actual encoded image data. 
std::string second_pass = decodedString.substr(decoding_prefix.length(),  (decodedString.length() - decoding_prefix.length())); 
std::string imageData = base64_decode(second_pass); 

// Write image to file 
ofstream image; 
image.open(std_FilePath.c_str()); 
image << imageData; 
image.close(); 

return scope.Close(String::New(" ")); 
//return scope.Close(decoded); 
} 

void Init(Handle<Object> target) { 

// Register all functions here 
target->Set(String::NewSymbol("generateImageFromData"), 
    FunctionTemplate::New(GenerateImageFromData)->GetFunction()); 
} 

NODE_MODULE(modutils, Init); 

그것은 다른 사람을 위해 도움이 될 것입니다 희망에서 base64로 C++ 인코더/디코더를 사용합니다.