diff --git a/DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs b/DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs index eb44d4a9..badf681e 100644 --- a/DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs +++ b/DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading; @@ -63,8 +64,15 @@ internal partial class ExportAssetDownloader(string workingDirPath, bool reuse) await Http.ResiliencePipeline.ExecuteAsync( async innerCancellationToken => { - // Download the file - using var response = await Http.Client.GetAsync(url, innerCancellationToken); + // Download the file. + // Use ResponseHeadersRead so the response body is streamed to disk instead of + // being fully buffered into memory first, which can cause an OutOfMemoryException + // on large attachments. + using var response = await Http.Client.GetAsync( + url, + HttpCompletionOption.ResponseHeadersRead, + innerCancellationToken + ); await using var output = File.Create(filePath); await response.Content.CopyToAsync(output, innerCancellationToken); },