发送到 API 端点时如何读取文件

How a file is read when sent to an API end point

问题:我想知道如果发送到一个端点,文件是如何被读取的。

阅读多篇文章并进行一些研究后,我能够将文件发送到 Amazon S3 存储桶。下面是 working code 但我不明白文件是如何通过 Postman 发送到我的 API 的,处理是如何发生的,代码是如何读取这个文件的。谁能帮我解码这段代码。

I have added line numbers to the code I want to understand.

Line Number

1 [httppost]
2 public async Task<bool> Upload()
  {
    try
    {
3       var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
4       foreach (var content in filesReadToProvider.Contents)
        {
5           var stream = await content.ReadAsStreamAsync();
6           using (StreamReader sr = new StreamReader(stream))
            {
                string line = "";
7               while ((line = sr.ReadLine()) != null)
                {
8                   using (MemoryStream outputStream = new MemoryStream())
9                   using (StreamWriter sw = new StreamWriter(outputStream))
                    {
                        sw.WriteLine(line);
10                      sw.Flush();
                        PutRecordRequest putRecord = new PutRecordRequest();
                        putRecord.DeliveryStreamName = myStreamName;
                        Record record = new Record();
11                      outputStream.Position = 0;
                        record.Data = outputStream;
                        putRecord.Record = record;
                        try
                        {
                            await kinesisClient.PutRecordAsync(putRecord);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Failed to send record to Kinesis. Exception: {0}", ex.Message);
                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
    }

    return true;
  }

P.S: 我正在通过 Postman 发送一个文件来测试这个端点的工作。

我对上面代码的理解。

Line Number 1: 这是一个 HTTPPOST 请求,这意味着我发送的内容将在请求的 body 中,而不是在 headers 或 URL.由于我发送的是文件,所以文件内容会在请求的body中发送。

Line Number 2: asyn 所以它将 运行 在一个单独的线程上所以我的 UI (如果有的话)会响应。

Line Number 3: 我猜 Request 基本上是一个句柄来读取任何 API 请求的 body 内容,所以我正在使用 Request.Content,
问题:ReadAsMultipartAsync是什么意思:它说:Reads all body parts within a MIME multipart message and produces a set of System.Net.Http.HttpContent instances as a result.?这是什么意思?这是否意味着如果我的文件有 10 行,它会读取所有 10 行并将其存储在内存中(通俗地说)?

Line Number 4: 我猜 filesReadToProvider.Contents 又是我在文件中的所有这 10 行的句柄。这是否意味着如果我的文件中有 10 行 这将循环 运行 10 次 (I我想我错了).

Line Number 5: ReadAsStreamAsync 它说:Serialize the HTTP content and return a stream that represents the content as an asynchronous operation.。这是否意味着它一次读取 1 行并将其序列化?但为什么要序列化这些行?

LineNumber 6: 因为我有流要处理,所以我正在创建一个流读取器实例并将流传递给它。 (通俗地说:我正在传递我正在阅读的一行文件)?

除此之外我迷路了。在此之后我完全感到困惑。什么是流?它是我文件中的一行吗?

问题:请有人帮助我理解上面代码中发生的事情。我不认为我可以直接 link 一个 行文件与一个流 。请指导我。

流就是数据流,可以有很多不同的类型。 StreamReader 将读入文件,它需要一个流来将其读入。您没有从文件中传递一行,您基本上是打开一个文件并将其内容异步读入流中。当实际数据太大而无法在写出之前一次性全部读入内存时,人们有时会使用这样的流。

此代码使用内存流来缓冲它从文件中读取的信息,并使用 KinesisClient 将其写出。我对 KinesisClient 不是很熟悉,但鉴于您说代码有效,我会说它正在优雅地处理解析正在传递的流以写出信息。

第 1 行:设置响应 HttpPost 的方法

第 2 行:async 意味着关闭并执行任务(可以在单独的线程上,在这种情况下),并在该任务完成或失败时重新调用此方法。

第 3 行:Multipart HTTP 是一种经常用于发送文件的标准

第4行:这是用户发送的Multipart请求的不同内容。

第 5 行:将此部分的内容作为流获取。流只执行字节读取,对用户来说不是很友好。因此第 6 行中的 StreamReader。

第 6 行:创建一个 StreamReader,它是一个助手 class 允许逐行处理流。

第 7 行:执行循环,将行作为字符串获取,直到遇到空值。

第8行:构建内存流。内存流是一种流,其中 read/write 操作在内存中执行,而不是从网络或磁盘执行。

第 9 行:在内存流周围使用 StreamWriter。 StreamWriter 是一个帮助程序 class,可以让基于行的操作更简单。

第 10 行:使用 StreamWriter 从第 7 行开始的循环中写入当前行。我们刷新它,以便它在其中包含完整的行。如果我们不这样做,它可能不会拥有所有内容。默认情况下,流将缓冲,这意味着它们将延迟它们的 read/writes 直到将足够的数据添加到它们作为性能优化。这会强制 read/write 操作。

第 11 行:如果我们不将 MemoryStream 的位置设置回 0,它将在插入该行后尝试读取。这会将其设置回该行的开头。 MemoryStream 基本上是一个字节缓冲区,其中包含您放入其中的内容以及当前 Read/Write 位置信息。