Cloudinary长视频上传报错:Error while copying content to a stream异常求助
解决大视频上传时的连接中断/超时问题
从你的报错堆栈来看,这个问题是上传过程中请求超时或者连接被主动中断导致的——短视频体积小、上传快,不会触发超时限制;但稍大的视频上传耗时久,就会碰到默认配置的瓶颈。下面是具体的修改方案:
1. 给Cloudinary客户端设置更长的超时时间
默认的HttpClient超时时间很短(通常100秒左右),大视频上传需要更充裕的时间。你可以在初始化Cloudinary时自定义HttpClient,设置更长的超时阈值:
public class VideoAccessor : IVideoAccessor { private readonly Cloudinary _cloudinary; public VideoAccessor(IConfiguration config) { var account = new Account(); // 将配置字符串绑定到Account对象(比直接传字符串更灵活,便于后续调整) Newtonsoft.Json.JsonConvert.PopulateObject(config["cloudinary"], account); // 创建自定义HttpClient,设置5分钟超时(可根据你的视频平均大小调整) var httpClient = new HttpClient { Timeout = TimeSpan.FromMinutes(5) }; _cloudinary = new Cloudinary(account) { HttpClient = httpClient }; } // 其他代码保持不变... }
2. 启用Cloudinary的分块上传功能
对于大文件,启用分块上传可以把视频拆成小块逐个上传,避免单次请求因耗时过长被中断。修改你的上传参数配置:
public VideoUploadResult UploadClip(IFormFile videoFile) { var uploadResult = new CloudinaryDotNet.Actions.VideoUploadResult(); if (videoFile.Length > 0) { using (var filestream = videoFile.OpenReadStream()) { var uploadParams = new VideoUploadParams { File = new FileDescription(videoFile.FileName, filestream), Transformation = new Transformation().StartOffset("0").EndOffset("120").Crop("fill"), // 启用分块上传,设置每块大小为6MB(Cloudinary官方推荐值) UseChunkedUpload = true, ChunkSize = 6 * 1024 * 1024 }; uploadResult = _cloudinary.Upload(uploadParams); } } // 异常处理逻辑... }
3. 调整ASP.NET Core的请求大小限制
ASP.NET Core默认限制了上传文件的大小(默认约30MB),如果你的视频超过这个阈值,服务器会直接中断请求。在Program.cs中配置更大的限制:
// 放在builder.Build()之前 builder.Services.Configure<FormOptions>(options => { // 设置最大上传文件大小为500MB(根据你的业务需求调整) options.MultipartBodyLengthLimit = 500 * 1024 * 1024; }); // 如果使用.NET 6+的最小API,还要添加请求体大小限制的中间件 app.UseHttpsRedirection(); app.UseAuthorization(); app.Use(async (context, next) => { context.Request.ContentLengthLimit = 500 * 1024 * 1024; await next(); }); app.MapControllers();
4. 优化异常处理,区分超时和其他错误
原来的异常处理过于笼统,你可以针对性捕获超时异常,给出更明确的业务提示:
try { uploadResult = _cloudinary.Upload(uploadParams); } catch (TaskCanceledException ex) { // 判断是否是超时导致的请求取消 if (ex.InnerException is HttpRequestException httpEx) { throw new Exception("视频上传超时,请检查网络状态或尝试上传更小的视频文件", httpEx); } throw; // 如果是主动取消请求,则重新抛出原异常 } catch (HttpRequestException ex) { throw new Exception("上传过程中网络连接异常,请稍后重试", ex); } if (uploadResult.Error != null) { throw new Exception($"Cloudinary上传错误:{uploadResult.Error.Message}"); }
这些修改应该能解决你遇到的大视频上传中断问题。
内容的提问来源于stack exchange,提问作者user13468285
相关产品推荐
相关产品推荐

