2016-10-03 9 views
2

У меня есть буфер, созданный из изображения с базой 64. Im пытается отправить с POST на службу с fs.createReadStream (..) труба (запрос (..)), но получаю следующее сообщение об ошибке:.«Путь должен быть строкой без нулевых байтов», когда поток трубопровода для запроса

Error: Path must be a string without null bytes 
    at nullCheck (fs.js:135:14) 
    at Object.fs.open (fs.js:626:8) 
    at ReadStream.open (fs.js:1916:6) 
    at new ReadStream (fs.js:1903:10) 
    at Object.fs.createReadStream (fs.js:1850:10) 
    at Promise (/Users/Sebbe/Documents/Code/leo-faq-service/lib/server/services/zendesk-service.js:120:10) 
[...] 

fs.createReadStream() принимает либо строки или Буфер. Если это строка, то предполагается, что это путь к файлу. Мне кажется, что fs.createReadStream() пытается разрешить аргумент как строку, содержащую путь, даже если это буфер. Возможно, это ошибка в Nodes Buffer API?

Подробнее:

У меня есть сервис Node построен с Restify. Эта служба имеет конечную точку, которая принимает объект, сообщение, имя и файл с кодировкой base64 (jpg, png и т. Д.).

Теперь мы хотим отправить содержимое файла третьей стороне с использованием JavaScript в узле.

Когда я прочитал об этом, есть несколько источников, в которых говорится, что я должен создать «Readable Stream» с буфером-объектом и передать его на запрос, отправляющий его третьей стороне.

Из-за этого я создаю буфер из моего кодированного изображения base64 и отправляю его как аргумент fs.createReadStream, который затем передаю в объект запроса.

В соответствии с этим я должен быть в состоянии создать буфер из base64 строки: https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding

В соответствии с этим я должен быть в состоянии создать читаемый поток из буфера: https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

И в соответствии с этим Я должен быть в состоянии использовать модуль запроса к трубе буфера к POST-запроса: https://www.npmjs.com/package/request

Цитата из запроса модуля документации:

You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case application/json) and use the proper content-type in the PUT request (if the headers don’t already provide one).

fs.createReadStream('file.json').pipe(request.put(url))

_postFile(base64FileContent) { 
 
    const fileBuffer = Buffer.from(base64FileContent, 'base64'); 
 
    const fileUploadOptions = this._getRequestPostFileOptions('uploads', fileBuffer.length); 
 

 
    return new Promise((resolve, reject) => { 
 
     fs.createReadStream(fileBuffer) 
 
     .pipe(request.post(fileUploadOptions) 
 
      .on('response', (response) => { 
 
      resolve(response); 
 
      }) 
 
      .on('error', (error) => { 
 
      reject(error); 
 
      }) 
 
     ); 
 
    }); 
 
    } 
 

 
    _getRequestPostFileOptions(resourceName, dataLength) { 
 

 
    return { 
 
     uri  : url.parse(`${this.coreBaseUrl}/${resourceName}`), 
 
     timeout : RequestTimeout, 
 
     method : 'POST', 
 
     headers : { 
 
     'Authorization' : `Basic ${this.auth}`, 
 
     'Content-Type' : 'application/binary', 
 
     'Content-Length' : dataLength 
 
     } 
 
    }; 
 
    }

+0

Что делает это возвращение 'url.parse ('$ {this.coreBaseUrl}/$ {ResourceName} ') '? –

+0

пример: this.coreBaseUrl = 'http://www.url.to/api' resourceName = 'articles' или 'user' or 'comments' Затем я использую url.parse (..) для объединения оба действительны для URL. – Spetastium

+0

Можете ли вы подтвердить, будет ли он передаваться в виде строки после того, как вы выполните 'url.parse (..)'? –

ответ

0

fs.createReadStream()всегда принимает путь к файлу в качестве первого аргумента. Похоже, вы передаете содержимое двоичного файла в качестве аргумента пути к файлу для fs.createReadStream(). Если мое предположение верно, то вы должны просто нужно передать буфер, как тела request() так:

return new Promise((resolve, reject) => { 
    fileUploadOptions.body = fileBuffer; 
    request.post(fileUploadOptions) 
     .on('response', (response) => { 
      resolve(response); 
      }) 
     .on('error', (error) => { 
      reject(error); 
     }); 
}); 
+0

Спасибо, я проверю это и вернусь с результатами. – Spetastium

+0

Согласно [документации] (https://nodejs.org/api/fs.html # fs_fs_createreadstream_path_options), он может принимать буфер в качестве первого аргумента – Grant

+0

@Grant да, вы можете использовать объекты Buffer для путей к файлам в 'fs' в последних версиях узла, но это не имеет отношения к этой ситуации, потому что не должно быть нулевых байтов , поэтому причиной входа в файл является особенно подозрительный. – mscdex