我有一个.net core 2.1 api应用程序,它将根据文件名从远程位置下载文件。这是代码:
static public class FileDownloadAsync
{
static public async Task DownloadFile(string filename)
{
//File name is 1GB.zip for testing
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
using (HttpClient client = new HttpClient())
{
string url = @"http://speedtest.tele2.net/" + filename;
using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
using (Stream readFrom = await response.Content.ReadAsStreamAsync())
{
string tempFile = $"D:\\Test\\{filename}";
using (Stream writeTo = File.Open(tempFile, FileMode.Create))
{
await readFrom.CopyToAsync(writeTo);
}
}
stopwatch.Stop();
Debug.Print(stopwatch.Elapsed.ToString());
}
}
}
这很好用,它将在大约50秒的时间内拉出1 gig文件。完全在所需的下载时间内。我已经硬编码了一个测试文件,并用此代码下载该文件进行测试以及存储位置-这些值最终会在进入生产环境时来自配置文件。这是调用此功能的API端点:
[HttpGet("{fileName}")]
public async Task<string> GetFile(string fileName)
{
await FileDownloadAsync.DownloadFile(fileName);
return "Done";
}
因此将文件从远程位置下载到本地服务器不是问题。关于将此文件重新发布到另一个API,我需要一些帮助/指导。下载文件后,将对文件进行一些准备工作以准备上载(文件均为MP4文件),完成该工作后,我需要将其发布到另一个API进行更专有的处理。这是我拥有的API端点数据:
POST:/ batch / requests分配资源以开始新的批处理转录。使用此方法在输入上请求[工作] 音频数据。根据接受的请求,响应提供 有关关联的请求ID和处理状态的信息。
标头:授权:授权令牌
接受:application / json
Content-Type:指示音频格式。该值必须是: 音频/ x-wav;编解码器= pcm;位= 16;速率= 8000;通道= 1 音频/ x-wav;编解码器= pcm;位= 16;速率= 16000;通道= 1 音频/ x原始;编解码器= pcm;位= 16;速率= 8000;通道= 1 audio / x-raw; codec = pcm; bit = 16; rate = 16000; channels = 1
视频/ mp4
Content-Length(可选):输入语音文件的大小。 不 如果使用分块传输,则为必填项。
查询字符串参数(必填):
profileId:受支持(请参阅GET配置文件)之一customerId:的ID 客户。字符串,最少1个,最多250个字母数字,点 (。)和破折号(-)。
因此,我将Content-Type设置为video / MP4进行处理。请注意,如果使用分块传输,则不使用输入大小。
现在,我更关心的是仅以非分块格式发布(流式传输)文件,而我们正在等待有关他们认为“分块”文件的更多信息。
因此,我正在寻求有关将文件从磁盘转移到端点的帮助。我为.net核心API运行的所有操作都是创建API以从POST(例如Razor页面或Angular页面)下载文件-我已经拥有了。我只需要一些“重新发布”到另一个API的帮助。
谢谢
答案 0 :(得分:0)
使用HttpClient
打开文件流,创建内容流,设置必要的标题并发布到端点
Stream file = File.Open(filepath, FileMode.Open);
var content = new StreamContent(file);
content.Headers.ContentType = new MediaTypeHeaderValue("video/MP4");
client.DefaultRequestHeaders.Add("Authorization", "token here");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json");
using (HttpResponseMessage response = await client.PostAsync(url, content)) {
//...
}