2017-03-28 116 views
1

我从返回一些XML及相关文件API调用接收的一些数据(PDF文件):MIME二进制数据PDF

var req = http.request(HTTPOPTIONS, function(resp){ 
var rawData = ''; 
//Build list from response data 
resp.on('data', function (chunk) { 
    rawData+= chunk; 
}); 
//Process List 
resp.on('end', function() { 
     var breakStr = rawData.split('\n')[0]; 
     var fileSections = rawData.split(breakStr); 
     for(var i in fileSections){ 
      var content = fileSections[i].split((/Content-Length: [0-9]*/)); 
      var fileName = content[0].split('filename=')[1].trim(); 
      var file = {Bucket : 'MyBucket', Key: ROOT+'/'+FOLDER+'/'+SUBFOLDER+'/'+fileName, Body: content[1]}; 
      console.log('Creating file: '+file.Key); 
      promises.push(S3.upload(file).promise()); 
     } 
     Promise.all(promises).then(...); 
    }); 
}); 
req.write(XMLREQUEST); 
req.end(); 

但我当我试图打开我得到an error message saying the file is damaged创建的文件[

关于我要去哪里的任何想法都是错误的?

UPDATE:

除了上述错误消息我也得到[an error saying the 'document has been changed'

在这些文件我得到的元数据(页大小/格式和字体数据),但没有任何内容。

+0

你打开创建的文件,找出它包含什么? (将其作为原始数据文件打开,而不是PDF)如果您的内容分割工作正常,应该给您一个想法。 –

+0

是的,内容看起来不错,在文本编辑器(例如记事本)中查看时有很多' '字符,但是当我在十六进制/二进制编辑器中打开它时,这些字符将替换为3个字符的字符串,假定文本编辑器无法解码。 – Simon

回答

1

看来问题是因为我将数据存储在一个字符串中并试图从那里操纵它。传入数据chunk是一个缓冲区,并以此形式使用它意味着,一旦找出如何删除标题,就可以创建PDF文件。

var req = http.request(HTTPOPTIONS, function(resp){ 
var respChunks =[]; 
var respChunksLength = 0; 

resp.on('data', function (chunk) { 
    respChunks.push(chunk); 
    respChunksLength+=chunk.length; 
}); 

resp.on('end', function() { 
    var confResp = Buffer.concat(respChunks, respChunksLength); 
    var breakStr = confResp.slice(0,confResp.indexOf('\n')); 
    var bufferArray = []; 
    var startBreak = confResp.indexOf(breakStr); 
    while(startBreak>-1){ 
     bufferArray.push(confResp.slice(startBreak+breakStr.length+1,confResp.indexOf(breakStr,startBreak+1))); 
     startBreak = confResp.indexOf(breakStr,startBreak+1); 
    } 
    var trim=0; 
    for(var i = 1; i<bufferArray.length;i++){ 
     trim = bufferArray[i].toString().indexOf('%'); 
     fs.writeFile('testFile'+i+'.pdf',bufferArray[1].slice(trim)); 
    }); 
}); 
req.write(generateProposalDetailXML()); 
req.end(); 

bufferArray被连接成一个单一的缓冲器,这是随后基于MIME定界符(breakStr)和集管分割(笨拙地)取出并写入到一个文件。