发送到 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 位置信息。
问题:我想知道如果发送到一个端点,文件是如何被读取的。
阅读多篇文章并进行一些研究后,我能够将文件发送到 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 位置信息。