2017-05-03 14 views
0

zipファイルをC#でbase64にエンコードする方法と、それを取得/デコードする方法Node JS?ファイルをC#でbase64にエンコードし、ノードJSでデコードする

私はzipファイルとして保存base64でデコードするために以下のコードを使用している私はC#で

Byte[] bytes = File.ReadAllBytes("path of the file"); 
String file = HttpServerUtility.UrlTokenEncode(bytes); 

をBASE64に変換するには、以下のコードを使用している

var fs = require('fs'); 
var buf = new Buffer(fs.readFileSync('decoded.txt'), 'base64'); 
fs.writeFileSync('test.zip', buf); 

しかし、ときに私は抽出しようとしていますZIPファイル。ジップが壊れています。

同じ言語のzipファイルでエンコード/デコードを実行しても、壊れていません。

私はそれについて研究しました。 C#バイト配列でUTF-8を変換してからbase64に変換します。しかし、私は間違っている会話については全く知らない。

私をご案内ください。特に私はC#についてあまり考えていません。

+1

この回答をhttp://stackoverflow.com/questions/13938137/convert-utf-8-to-base64-string~~Vは、UTF-8からの変換を説明しますコード64に。反対をやってみてください;) – Srikanth

答えて

0

最後に、私の問題の解決策が見つかりました。それは同じ問題に直面している他の人に役立つかもしれません。私はC#でファイルにBASE64エンコードを保存しNodeJSからそれを読んでいた@Srikanth

HttpServerUtility.UrlTokenEncode to System.Convert.ToBase64String(bytes); 

2)によって参照されるよう

1)C#のエンコーディングを変更しました。問題は、NodeJS(常に破損したzipを取得する)UTF8の問題を使用してデコードする際に問題となる追加文字をファイルに追加することです。 zipファイル

をC#プロジェクトから受信BASE64を復号するためのBase64エンコードに

using System; 
using System.IO; 
namespace email_zip 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      byte[] bytes = File.ReadAllBytes("./7738292858_January_February_2017.zip"); 
      string base64 = System.Convert.ToBase64String(bytes); 
      Console.WriteLine(base64); 
     } 
    } 
} 

NodeJSコードをzipファイルを変換して抽出するために

C#コードから受け取ったbase64文字列をデコード.NETプロジェクト、ジップ ファイルを抽出し、デコードされたzipファイルに含まれるすべてのファイルを一覧表示する (zipExtractor.js)

'use strict'; 
/** 
* Decodes base64 string received from .NET project, Extract the zip file, and list all files included in decoded zip file 
*/ 
var errSource = require('path').basename(__filename), 
    fs = require('fs'), 
    path = require('path'), 
    async = require('async'), 
    debug = require('debug')('cs:' + errSource), 
    AdmZip = require('adm-zip'), 
    mimeType = require('mime-types'), 
    ZIP_EXTRACT_DIR = 'zip_extract'; // Default zip extract directory 
// Check is zip extract directory exists/not. If not creates the directory 
var zipExtractorDir = path.join(__dirname, ZIP_EXTRACT_DIR); 
if (!fs.existsSync(zipExtractorDir)) { 
    fs.mkdirSync(zipExtractorDir); 
} 
/** 
* Callback for getting the decoded Base64 zip file 
* 
* @callback extractCallback 
* @param {Object} err If unable to decode Base64 and save zip file  
* @param {Array<Object>} attachments Zip file extracted files 
*/ 
/** 
* extract 
* 
* Decodes base64 string received from .NET project 
* Covert to zip file 
* Extract the zip file and return all the mine-type and file data information 
* 
* @param {String} ticketInfo Base64 encoded string 
* @param {extractCallback} callback - A callback to decode and zip file extract 
*/ 
function extract(ticketInfo /* Base64 encoded data */ , callback) { 
    console.time('extract'); 
    async.waterfall([ 
     async.constant(ticketInfo), 
     base64Decode, 
     zipExtractor, 
     deleteFile 
    ], function(err, result) { 
     console.timeEnd('extract'); 
     debug('extract', 'async.waterfall->err', err); 
     debug('extract', 'async.waterfall->result', result); 
     if (err) { 
      // log.enterErrorLog('8000', errSource, 'extract', 'Failed to extract file', 'Error decode the base64 or zip file corrupted', err); 
      return callback(err, null); 
     } 
     return callback(null, result); 
    }); 
} 
/** 
* Callback for getting the decoded Base64 zip file 
* 
* @callback base64DecodeCallback 
* @param {Object} err If unable to decode Base64 and save zip file  
* @param {String} fileName Zip decode file name 
*/ 
/** 
* Create file from base64 encoded string 
* 
* @param {String} ticketInfo Base64 encoded string 
* @param {base64DecodeCallback} callback - A callback to Base64 decoding 
*/ 
function base64Decode(ticketInfo, callback) { 
    var decodeFileName = 'decode_' + new Date().getTime() + '.zip', // Default decode file name 
     base64DecodedString = new Buffer(ticketInfo, 'base64'); // Decodes Base64 encoded string received from.NET 
    fs.writeFile(path.join(__dirname, ZIP_EXTRACT_DIR, decodeFileName), base64DecodedString, function(err) { 
     if (err) { 
      //log.enterErrorLog('8001', errSource, 'base64Decode', 'Failed to save the base64 decode zip file', '', err); 
      return callback(err, null); 
     } 
     return callback(null, decodeFileName); 
    }); 
} 
/** 
* Callback for getting the decoded Base64 zip extracted file name. 
* 
* @callback zipExtractorCallback 
* @param {Object} err Unable to extract the zip file 
* @param {String} fileName Zip decode file name's 
*/ 
/** 
* Extract zip file 
* 
* @param {String} zipFile Decoded saved file 
* @param {zipExtractorCallback} callback - A callback to Base64 decoding 
*/ 
function zipExtractor(zipFile, callback) { 
    try { 
     var zipFilePath = path.join(__dirname, ZIP_EXTRACT_DIR, zipFile), 
      zip = new AdmZip(zipFilePath), 
      zipEntries = zip.getEntries(); // An array of ZipEntry records 
     zip.extractAllTo(/*target path*/ ZIP_EXTRACT_DIR, /*overwrite*/ true); 
     var zipFileAttachments = []; 
     zipEntries.forEach(function(zipEntry) { 
      if (!zipEntry.isDirectory) { // Determines whether the zipEntry is directory or not 
       var fileName = zipEntry.name, // Get of the file 
        filePath = path.join(__dirname, ZIP_EXTRACT_DIR, fileName), 
        attachment = { 
         filename: fileName, 
         path: filePath, 
         contentType: mimeType.contentType(path.extname(filePath)) 
        }; 
       zipFileAttachments.push(attachment); 
      } 
      debug('zipExtractor->', 'attachment', attachment); 
     }); 
     return callback(null, { 
      name: zipFile, 
      attachments: zipFileAttachments 
     }); 
    } catch (err) { 
     // log.enterErrorLog('8002', errSource, 'zipExtractor', 'Failed to extract file', 'Error decode the base64 or zip file corrupted', err); 
     return callback(err, null); 
    } 
} 
/** 
* Callback for getting the status of deleted decode file 
* 
* @callback deleteFileCallback 
* @param {Object} err Unable to delete the zip file 
* @param {Array<Object>} attachment All zip file attachment Object 
*/ 
/** 
* Delete decode zip file from the system 
* 
* @param {String} zipFile Decoded saved file 
* @param {deleteFileCallback} callback - A callback to Base64 decoding 
*/ 
function deleteFile(zipFileExtractInfo, callback) { 
    var fileName = zipFileExtractInfo.name, 
     filePath = path.join(__dirname, ZIP_EXTRACT_DIR, fileName); 
    fs.unlink(filePath, function(err) { 
     if (err && err.code == 'ENOENT') { 
      //log.enterErrorLog('8003', errSource, 'deleteFile', 'Failed to delete decode zip file', fileName, err); 
      debug('deleteFile', 'File doest exist, wont remove it.'); 
     } else if (err) { 
      //log.enterErrorLog('8003', errSource, 'deleteFile', 'Failed to delete decode zip file', fileName, err); 
      debug('deleteFile', 'Error occurred while trying to remove file'); 
     } 
     return callback(null, zipFileExtractInfo.attachments); 
    }); 
} 

module.exports = { 
    extract: extract 
}; 

NodeJSからC#のプログラムを実行し、Base64でコンソール出力を読み取ります。 zipExtractor.jsを使用したデコード。

var zipExtractor = require('./zipExtractor'); 
console.time('dotnet run'); 
var exec = require('child_process').exec; 
// Follow instruction to set .NET in Mac OS https://www.microsoft.com/net/core#macos 
exec('dotnet run', function(error, stdout, stderr) { 
    console.timeEnd('dotnet run'); 
    if (error) { 
     console.error(error); 
     return; 
    } else if (stderr) { 
     console.error(stderr); 
     return; 
    } 
    zipExtractor.extract(stdout, function(err, attachments) { 
     if (err) { 
      console.error(err); 
     } 
     console.info(attachments); 
    }); 
}); 

出力:

dotnet run: 9738.777ms 
extract: 155.196ms 
[ { filename: '7738292858_January_February_2017.pdf', 
    path: '/Users/andan/Documents/email_zip/zip_extract/7738292858_January_February_2017.pdf', 
    contentType: 'application/pdf' } ] 
関連する問題