Blazor WebApp直传文件至MinIO时连接异常关闭问题
问题分析与解决方案
核心错误原因
你用MultipartFormDataContent包装文件流发送PUT请求,但MinIO的预签名PUT接口仅接受原始文件流作为请求体,不支持表单格式。Postman能成功是因为直接将文件内容作为请求体发送,而代码中的表单格式导致MinIO无法解析请求,提前关闭了连接,从而抛出连接被远程主机关闭的异常。
修复代码
替换OnInputFileChange方法中构建请求内容的部分,去掉MultipartFormDataContent,直接使用StreamContent:
private async Task OnInputFileChange(InputFileChangeEventArgs e) { shouldRender = false; long maxFileSize = 1024 * 1024 * 1024; var selectedFile = e.File; if (selectedFile != null) { try { file = new() { Name = selectedFile.Name }; // 获取预签名URL var resp = await client.GetUrl(); if (resp is null) return; // 直接使用StreamContent,不需要Multipart包装 var fileContent = new StreamContent(selectedFile.OpenReadStream(maxFileSize)); fileContent.Headers.ContentType = new MediaTypeHeaderValue(selectedFile.ContentType); // 可选:显式设置Content-Length,避免分块传输可能引发的问题 fileContent.Headers.ContentLength = selectedFile.Size; var response = await httpClient.PutAsync(resp, fileContent); // 验证请求是否成功,失败时直接抛出异常 response.EnsureSuccessStatusCode(); uploadResult = new UploadResult { FileName = selectedFile.Name, StoredFileName = "stored_" + selectedFile.Name, Uploaded = true }; } catch (Exception ex) { Logger.LogInformation("{FileName} not uploaded (Err: 6): {Message}", selectedFile.Name, ex.Message); uploadResult = new UploadResult { FileName = selectedFile.Name, ErrorCode = 6, Uploaded = false }; } } shouldRender = true; }
额外排查点
- 确认预签名URL的有效期,确保发送请求时URL未过期
- 检查MinIO服务器的
max_object_size配置,是否超过了你设置的maxFileSize(1GB) - 若MinIO使用自签名证书,需确保HttpClient信任该证书(可在Aspire配置中添加相关设置)
- 检查HttpClient的超时设置,避免大文件上传时超时断开连接
内容的提问来源于stack exchange,提问作者Rhywden
相关产品推荐
相关产品推荐

