C# webApi上传图片 代码篇

本文详细介绍了一个使用C#编写的文件上传组件,该组件能够处理多种类型的文件上传请求,并支持文件重命名功能。文章提供了完整的代码实现,包括如何设置上传路径、检查文件类型与大小限制、生成唯一文件名等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

代码篇,不多说

如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;

namespace FileUp.Controllers
{
    public class FileController : ApiController
    {
        [HttpPost]
        public async Task<string> UploadFileStream()
        {
            string returns = string.Empty;
            string fileType = "ss";//要创建的子文件夹的名字
            var uploadPath = "~/upload";
            string filePath = System.Web.HttpContext.Current.Server.MapPath(uploadPath + "/" + fileType + "/");//绝对路径
            //string filePath = uploadPath + "\\" + fileType + "\\";  //E:\Fileup  居家
            if (Directory.Exists(filePath) == false) 
            {
                Directory.CreateDirectory(filePath);
            }

            try
            {
                var provider = new ReNameMultipartFormDataStreamProvider(filePath);

                await Request.Content.ReadAsMultipartAsync(provider).ContinueWith(o =>
                {

                    foreach (var file in provider.FileData)
                    {
                        string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');//待上传的文件名
                        FileInfo fileinfo = new FileInfo(file.LocalFileName);
                        //判断开始
                        int maxSize = 10000000;
                        string oldName = orfilename;//选择的文件的名称
                        if (fileinfo.Length <= 0)
                        {
                            //文件大小判断 未选择上传的图片 大小为零
                        }
                        else if (fileinfo.Length > maxSize)
                        {
                            //文件大小判断 上传文件是否超限制
                        }
                        else
                        {
                            //
                            string fileExt = orfilename.Substring(orfilename.LastIndexOf('.'));
                            string Extension = fileExt;
                            string CreateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                            //定义允许上传的文件扩展名 
                            String fileTypes = "gif,jpg,jpeg,png,bmp";
                            if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
                            {

                                returns = "上传的文件格式不是图片";
                            }
                            else
                            {
                                returns = string.Format(@"/Uploads/{0}/{1}", fileType, System.IO.Path.GetFileName(file.LocalFileName));
                            }
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                returns = ex.ToString();
            }
            return returns;
        }

        /// <summary>
        /// 重命名上传的文件
        /// </summary>
        public class ReNameMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
        {
            public ReNameMultipartFormDataStreamProvider(string root)
                : base(root)
            { }

            public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
            {

                string extension = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? Path.GetExtension(GetValidFileName(headers.ContentDisposition.FileName)) : "";
                return Guid.NewGuid().ToString().Replace("-", "") + extension;
            }

            private string GetValidFileName(string filePath)
            {
                char[] invalids = System.IO.Path.GetInvalidFileNameChars();
                return String.Join("_", filePath.Split(invalids, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.');
            }

        }
    }
}
View Code

PostMan请求如下:

@陈卧龙的博客

<think>嗯,用户想用C# WebAPI实现XML文件上传功能。首先,我需要确定实现这个功能的基本步骤。根据之前的引用,可能需要创建一个控制器,处理HTTP请求。然后,用户需要上传文件,所以可能需要使用IFormFile来接收上传的文件。接下来,可能需要将上传的XML文件解析或存储。 首先,创建控制器。根据引用[1]和[2],WebAPI的控制器通常继承自ControllerBase,并使用[ApiController]属性。然后,添加一个Post方法,用[HttpPost]特性修饰。用户需要上传文件,所以参数里应该包含IFormFile类型的参数,比如public IActionResult UploadXml(IFormFile file)。不过,可能需要处理多部分表单数据,所以还要加上[FromForm]属性。 然后,处理文件上传的验证。比如检查文件是否为空,扩展名是否是.xml,或者内容类型是否为text/xml或application/xml。这样可以确保用户上传的是正确的文件类型。如果验证失败,返回BadRequest。 接下来,保存文件。使用Path.GetTempFileName()生成临时路径,然后用using语句将文件流复制到目标路径。完成后,可能需要处理XML内容,比如解析或存储到数据库。这里可以留出注释,让用户根据实际需求处理。 另外,根据引用[3],可能需要配置WebAPI以支持不同的内容类型。不过在这个案例中,上传的是文件,可能不需要特别配置响应格式,但如果有返回XML的需求,可能需要添加XML格式化器。引用[2]中提到添加AddXmlSerializerFormatters(),所以在Program.cs里需要配置builder.Services.AddControllers().AddXmlSerializerFormatters(),确保可以处理XML数据。 路由设置方面,控制器的Route应该是[Route("api/[controller]")],这样接口的URL就是/api/UploadXml。上传文件通常使用POST方法,所以方法的路由可以设为[HttpPost("upload")],最终的URL是api/UploadXml/upload。 测试部分,用户可以使用Postman发送multipart/form-data请求,选择文件并上传。需要提醒用户注意设置正确的Content-Type,并检查文件大小限制,可能需要调整Kestrel或IIS的配置,避免大文件上传失败。 可能的问题包括文件大小限制、XML解析错误处理,以及安全措施,比如文件类型检查、病毒扫描等。需要提醒用户在实际应用中考虑这些因素。 总结步骤:创建控制器,处理POST请求,验证文件,保存文件,处理XML内容,配置服务,测试接口。同时,生成相关问题帮助用户进一步优化和扩展功能。</think>### 分步实现C# WebAPI的XML文件上传功能 #### 1. 创建WebAPI控制器 创建继承自`ControllerBase`的控制器,定义文件上传接口: ```csharp [ApiController] [Route("api/[controller]")] public class FileUploadController : ControllerBase { [HttpPost("upload")] public async Task<IActionResult> UploadXml([FromForm] IFormFile file) { // 验证逻辑将在此处实现 } } ``` #### 2. 实现文件验证逻辑 添加基础验证保障安全性: ```csharp if (file == null || file.Length == 0) return BadRequest("未检测到有效文件"); if (Path.GetExtension(file.FileName).ToLower() != ".xml") return BadRequest("仅支持XML格式文件"); if (file.ContentType != "text/xml" && file.ContentType != "application/xml") return BadRequest("无效的MIME类型"); ``` #### 3. 文件存储处理 使用临时存储方案保存文件: ```csharp var tempPath = Path.GetTempFileName(); using (var stream = System.IO.File.Create(tempPath)) { await file.CopyToAsync(stream); } // 示例:XML内容解析(需根据业务实现) // var xmlContent = await System.IO.File.ReadAllTextAsync(tempPath); ``` #### 4. 服务端配置调整 在`Program.cs`中配置服务支持: ```csharp // 添加XML格式支持[^2] builder.Services.AddControllers() .AddXmlSerializerFormatters(); ``` #### 5. 客户端调用示例 使用Postman测试时需注意: - 选择`POST`方法 - 设置Body为`form-data` - 参数类型选`File` - Key字段名需与接口参数名`file`一致 #### 6. 完整代码示例 ```csharp [HttpPost("upload")] public async Task<IActionResult> UploadXml([FromForm] IFormFile file) { // 基础验证 if (file == null || file.Length == 0) return BadRequest("未检测到有效文件"); // 格式验证 var extension = Path.GetExtension(file.FileName).ToLower(); if (extension != ".xml") return BadRequest("仅支持XML格式文件"); // 存储处理 try { var tempPath = Path.GetTempFileName(); using (var stream = System.IO.File.Create(tempPath)) { await file.CopyToAsync(stream); } // 此处添加XML解析逻辑 return Ok(new { Status = "上传成功", FileSize = file.Length, TempPath = tempPath }); } catch (Exception ex) { return StatusCode(500, $"处理异常:{ex.Message}"); } } ``` #### 重要注意事项 1. **文件大小限制**:默认4MB限制,需在`Program.cs`配置: ```csharp builder.WebHost.ConfigureKestrel(opt => { opt.Limits.MaxRequestBodySize = 100_000_000; // 100MB }); ``` 2. **安全防护**: - 设置白名单:`FileExtensionContentTypeProvider` - 病毒扫描:集成第三方扫描库 - 文件隔离:存储在非web根目录 3. **性能优化**: - 使用流式处理代替全文件加载 - 异步编程模型 - 分布式文件存储方案
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值