2017-12-20 13 views
0

私はPortableWebDavLibraryを使用して、nextcloud WebDAV APIに接続しています。 https://github.com/DecaTec/Portable-WebDAV-Library別のAPIからファイルをダウンロードし、バッファでこれを返します。

私のシンプルなコントローラファイルのダウンロードが、メモリ内のファイル(のMemoryStream)とプロセスのメモリを保存する前に、最大のファイルに2つ以上の/ 3GBまで上昇さ

// GET api/download/Test/pedro.txt 
    [HttpGet("{*name}")] 
    public async Task<IActionResult> Get(string name) 
    { 
     if (String.IsNullOrEmpty(name)) 
     { 
      return BadRequest("TEXT ..."); 
     } 
     try 
     { 
      var credentials = new NetworkCredential("USER", "PASS"); 
      using (var webDavSession = new WebDavSession(Global.BASE_URL, credentials)) 
      { 
       var stream = new MemoryStream(); 
       stream.SetLength(20971520); // TEST set max size 

       var responseStream = await webDavSession.DownloadFileAsync(name, stream); 

       stream.Seek(0, SeekOrigin.Begin); 

       // Response.Headers.Add("content-disposition", "attachment; filename=" + name.TrimEnd('/').Split("/").Last()); 
       return new FileStreamResult(stream, new MediaTypeHeaderValue("application/octet-stream")) 
       { 
        FileDownloadName = name.TrimEnd('/').Split("/").Last() 
       }; 


      } 
     } 
     catch (Exception e) 
     { 
      return BadRequest("TEXT ..."); 
     } 

別のAPIからファイルを取得しているうちに、どのようにダウンロードできますか?バッファに似

編集31/12/2017

NextcloudこのFileStreamResult作業良いと、管理(WebDAVなし)GETリクエストを使用してファイルをダウンロードすることができます。

答えて

0

ええと、MemoryStreamのソリューションは、巨大なファイルではうまく機能しません。あなたは、いくつかの一時ファイルにダウンロードしたコンテンツを保存し、それをコンテンツアップロードして、それを修正することができます:

var tempFileName = Path.GetTempFileName(); 
var stream = new FileStream(tempFileName, FileMode.Create); 
await webDavSession.DownloadFileAsync(name, stream); 

stream.Seek(0, SeekOrigin.Begin); 
return new FileStreamResult(stream, new MediaTypeHeaderValue("application/octet-stream")) 
{ 
    FileDownloadName = name.TrimEnd('/').Split("/").Last() 
}; 

このコードの問題は、それがサーバー上の一時ファイルを残していることです。 GetTempFileName()は最終的にテンポラリファイルの数が65535に達するとIOExceptionをスローします。これを修正するには、コントローラアクションまたは別のサーバタスクで古いテンポラリファイルを定期的に削除する必要があります。

+0

答えていただきありがとうございます。一時フォルダにファイルを書き込むことはできません。同じ時間に彼を送り、すべてのファイルを読むのを待っていませんか? – erni

+0

この目的のために 'System.Net.Http'に' PushStreamContent'があります。残念ながら、この時点では.Net Coreには何も似ていません。 – CodeFuller

0

あなたが、streamはあなたがDownloadFileAsyncへの呼び出しが正常に戻った後に必要な情報を保持するために起こっているとして、求めているものを行うことができそうです。したがって、その前に何かを送ることは正確ではありません。

関連する問題