Как преобразовать файл, прочитанный с помощью fs, в тип Node.js в C# byte []? - PullRequest
2 голосов
/ 24 января 2020

Я интегрирую сервис в свое приложение, которое использует SOAP Api. Мое приложение на Node.js. В документации сервиса сказано, что для загрузки файла я должен использовать fileData типа Byte[] (байты фрагмента файла). Я пробовал разные подходы, но ни один из них не работал. Я даже пытался использовать Uint8Array (найдите здесь на SO некоторые ответы), но это тоже не сработало. Вот как выглядит мой запрос:

const url = `https://memoq.pangea.global:8080/memoQServices/FileManager/FileManagerService`;

async function addFilesToMemoq() {
    try {
        const fileData = fs.readFileSync('./dist/reqfiles/xtm/dev-req.doc', 'base64');        
        const headers = {
            'Content-Type': 'text/xml;charset=UTF-8',
            'soapAction': 'http://kilgray.com/memoqservices/2007/IFileManagerService/AddNextFileChunk',
        };
        for(let chunk of new Uint8Array(fileData)) {
            const xml = `${xmlHeader}
                    <soapenv:Body>
                    <ns:AddNextFileChunk>
                        <ns:fileIdAndSessionId>d00121ab-78ca-4dcf-80b7-9b3d9e4fb905</ns:fileIdAndSessionId>
                        <ns:fileData>${chunk}</ns:fileData>
                    </ns:AddNextFileChunk>
                    </soapenv:Body>
                </soapenv:Envelope>`        
            const { response } = await soapRequest({url, headers, xml});
            //Result is just for breakpoints if needed to debug
            const result = parser.toJson(response.body, {object: true, sanitize: true, trim: true});
        }
        return await finishMemoqFileMove();
        // return result;
    } catch(err) {
        return parser.toJson(err, {object: true, sanitize: true, trim: true}); 
    }
}

async function finishMemoqFileMove() {
    const xml = `${xmlHeader}
                <soapenv:Body>
                    <ns:EndChunkedFileUpload>
                        <ns:fileIdAndSessionId>d00121ab-78ca-4dcf-80b7-9b3d9e4fb905</ns:fileIdAndSessionId>
                    </ns:EndChunkedFileUpload>
                </soapenv:Body>
                </soapenv:Envelope>`
    const headers = {
        'Content-Type': 'text/xml;charset=UTF-8',
        'soapAction': 'http://kilgray.com/memoqservices/2007/IFileManagerService/EndChunkedFileUpload',
    };
    try {
        const { response } = await soapRequest({url, headers, xml});
        const result = parser.toJson(response.body, {object: true, sanitize: true, trim: true});
        return result;
    } catch(err) {
        return parser.toJson(err, {object: true, sanitize: true, trim: true}); 
    }
}

Но этот запрос отправляет в сервис пустой файл. new Uint8Array(fileData) становится массивом 0 с. Если я не использую Uint8Array, тогда я получу сообщение об ошибке: Base64 sequence length(3) not valid. Must be a multiple of 4. Если я использую base64, опция в readFileSync - fileData становится большой строкой символов, если я удаляю это, тогда fileData становится массивом (буфером) с номерами в качестве элементов. Для запросов soap я использую пакет узла easy-soap-request. Буду признателен, если кто-нибудь сможет помочь с этим.

Если это поможет, вот документы службы Я пытаюсь следовать.

...