ASP.NET Core 6 Web API如何将文件下载保存至指定路径?
实现将S3文件保存到指定本地路径的ASP.NET Core Web API接口
你需要修改现有接口,新增本地路径参数,并将S3返回的文件流写入到指定路径,而非返回给客户端浏览器。以下是具体实现方案:
修改后的代码
[HttpGet("download-to-path")] public async Task<IActionResult> DownloadFileToPath(string bucketName, string fileName, string filePath) { // 参数合法性校验 if (string.IsNullOrWhiteSpace(bucketName) || string.IsNullOrWhiteSpace(fileName) || string.IsNullOrWhiteSpace(filePath)) { return BadRequest("bucketName、fileName和filePath参数不能为空"); } var amUp = new AmazonUploader(); using (var amazonS3client = amUp.GetS3Client()) { try { var response = await amazonS3client.GetObjectAsync(new GetObjectRequest() { BucketName = bucketName, Key = fileName }); if (response.ResponseStream == null) { return NotFound("指定的S3文件不存在"); } // 提前创建目标文件所在目录(避免目录不存在导致写入失败) var targetDirectory = Path.GetDirectoryName(filePath); if (!Directory.Exists(targetDirectory)) { Directory.CreateDirectory(targetDirectory); } // 将S3文件流写入本地指定路径 using (var localFileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { await response.ResponseStream.CopyToAsync(localFileStream); } return Ok($"文件已成功保存到路径:{filePath}"); } catch (AmazonS3Exception s3Ex) { return StatusCode(StatusCodes.Status500InternalServerError, $"S3服务操作异常:{s3Ex.Message}"); } catch (IOException ioEx) { return StatusCode(StatusCodes.Status500InternalServerError, $"本地文件写入异常:{ioEx.Message}"); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, $"未知异常:{ex.Message}"); } } }
关键改动说明
- 新增参数:添加
filePath参数,用于接收客户端指定的本地保存路径 - 流处理逻辑调整:不再返回
File结果给浏览器,而是将S3返回的ResponseStream通过CopyToAsync写入到本地文件流 - 目录预创建:提前检查并创建目标文件所在的目录,避免因目录不存在导致写入失败
- 增强异常处理:捕获S3操作、本地文件IO等场景的异常,返回更明确的错误信息
- 参数校验:增加必填参数的合法性检查,避免无效请求
注意事项
- 权限配置:确保运行API的进程拥有对
filePath指定路径的写入权限,否则会抛出权限不足的异常 - 路径合法性校验:建议额外添加对
filePath格式的合法性检查,避免客户端传入无效路径 - 大文件优化:如果需要处理超大文件,可考虑分块写入或调整流缓冲区大小,提升写入性能
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

