在.net核心中发布单个大文件

时间:2019-08-01 22:40:03

标签: asp.net-web-api .net-core

我有一个.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的帮助。

谢谢

1 个答案:

答案 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)) {
    //...
}