2016-08-10 15 views
0

У меня возникли проблемы с определением, как сохранять видеоданные, отправленные мне через HttpListener в PowerShell. У меня есть следующее, которое, я считаю, просто отправляет его обратно запрашивающему, но у меня проблемы с сохранением его в файле MP4.Сохранение видеоданных в файл из запроса POST InputStream в PowerShell

$req = $request 
    $body = $req.InputStream 
    $reader = New-Object System.IO.StreamReader ($body, $req.ContentEncoding) 
    $msg = $reader.ReadToEnd() 
    $reader.Close() 

    [byte[]] $buffer = [System.Text.Encoding]::UTF8.GetBytes($msg) 
    $res.ContentLength64 = $buffer.Length 
    $res.StatusCode = 200 
    $res.OutputStream.Write($buffer, 0, $buffer.Length) 
    $res.Close() 

Благодарим за ваше время eveyrone!

Update:

Я был в состоянии сделать файлы с этим, хотя по какой-то причине в примерах они используют 8192 байт размера, но PowerShell говорит, что это слишком большой. С этим я получаю файлы с нулевой длиной, никаких ошибок, которые я могу сказать.

$path = "c:\matthew3.mp4" 
    $file = New-Object System.IO.FileStream $path,CreateNew 

    [byte]$bytes = 255 

    [int]$bytes_read = 0 

    while ($bytes_read = $request.InputStream.Read($bytes, 0, $bytes.length) > 0) 

    { 

     $file.Write($bytes, 0, $bytes_read) 

    } 

На самом деле я получаю сообщение об ошибке:

Exception calling "GetBytes" with "1" argument(s): "Array cannot be null. 
Parameter name: chars" 
At line:45 char:1 
+ $buffer = [System.Text.Encoding]::UTF8.GetBytes($content) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ArgumentNullException 

Exception calling "Write" with "3" argument(s): "Value cannot be null. 
Parameter name: buffer" 
At line:47 char:1 
+ $response.OutputStream.Write($buffer, 0, $buffer.Length) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ArgumentNullException 
+1

Это действительно закодированы в UTF8? Я ожидаю, что это будет сырым, поэтому '[Text.Encoding] :: Default' следует использовать. Во всяком случае, в чем проблема? – wOxxOm

+0

Я пытаюсь сохранить его в файл, я обновил сообщение. Однако я получаю файл с нулевой длиной. Насколько я могу судить, я ни о чем не жалуюсь. Я использую инструмент «Почта» Chrome для отправки двоичного кода. Будет ли видеофайл просто загружен как сырьевой? –

+1

В зависимости от того, как работает Postman API, он может быть сырым, поскольку он наиболее эффективен для двоичных данных. Или это может быть JSON-stringified. Однако, судя по сообщениям об ошибках, которые вы добавили, ничего не получено вообще. Попробуйте отладить код по строкам. – wOxxOm

ответ

0

Так главный разработчик для нашей компании Ник указал мне в правильном направлении здесь.

Главное в том, что для объекта FileStream мне нужно добавить флаг записи, и использовать метод CopyTo на InputStream, а затем закрыть их обоих:

 $file = New-Object System.IO.FileStream $path,CreateNew,Write 

     $context.Request.InputStream.CopyTo($file) 

     $file.Close() 

     $context.Request.InputStream.Close()