C# Web Api 上传文件

一、 使用默认方法上传文件:

1、Action:

复制代码
 /// <summary>
        /// 上传文件 使用上传后的默认文件名称
        /// 默认名称是BodyPart_XXXXXX,BodyPart_加Guid码
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("Upload")]
        public async Task<string> Upload()
        {
            try
            {
                //web api 获取项目根目录下指定的文件下
                var root = System.Web.Hosting.HostingEnvironment.MapPath("/Resource/Images");
                var provider = new MultipartFormDataStreamProvider(root);
                
                //文件已经上传  但是文件没有后缀名  需要给文件添加后缀名
                await Request.Content.ReadAsMultipartAsync(provider);

                foreach (var file in provider.FileData)
                {
                    //这里获取含有双引号'" '
                    string filename = file.Headers.ContentDisposition.FileName.Trim('"');
                    //获取对应文件后缀名
                    string fileExt = filename.Substring(filename.LastIndexOf('.'));
                    
                    FileInfo fileinfo = new FileInfo(file.LocalFileName);
                    //fileinfo.Name 上传后的文件路径 此处不含后缀名 
                    //修改文件名 添加后缀名
                    string newFilename = fileinfo.Name + fileExt;
                    //最后保存文件路径
                    string saveUrl = Path.Combine(root, newFilename);
                    fileinfo.MoveTo(saveUrl);
                }
                return "success";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
复制代码

2、html模拟代码:

复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <h1>柠檬伙伴云</h1>
    <form action="/Test/Upload" method="post" enctype="multipart/form-data">

        <input type="file" name="f1"  /> <br /><br />
        <input type="file" name="f2" /> <br /><br />
   
        <input type="submit"  value="上传图片" /> 
        
    </form>
</body>
</html>
复制代码

3、效果如下图:

 

上图就是上传后文件没有后缀名效果

对第一张没有后缀名添加后缀名的效果

 

二、修改上传文件后缀名

1、action:

 

复制代码
/// <summary>
        /// 上传文件 修改上传文件名称 也不包含后缀名
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("Upload2")]
        public async Task<string> Upload2()
        {
            try
            {
                //web api 获取项目根目录下指定的文件下
                var root = System.Web.Hosting.HostingEnvironment.MapPath("/Resource/Images");
                //对上传文件重新命名 根据需求对应修改文件名称 不包含后缀名 只是前缀名
                var provider = new RenamingMultipartFormDataStreamProvider(root);

                //文件已经上传  但是文件没有后缀名  需要给文件添加后缀名
                await Request.Content.ReadAsMultipartAsync(provider);

                foreach (var file in provider.FileData)
                {
                    //这里获取含有双引号'" '
                    string filename = file.Headers.ContentDisposition.FileName.Trim('"');
                    //获取对应文件后缀名
                    string fileExt = filename.Substring(filename.LastIndexOf('.'));

                    FileInfo fileinfo = new FileInfo(file.LocalFileName);
                    //fileinfo.Name 上传后的文件路径 此处不含后缀名 
                    //修改文件名 添加后缀名
                    string newFilename = fileinfo.Name + fileExt;
                    //最后保存文件路径
                    string saveUrl = Path.Combine(root, newFilename);
                    fileinfo.MoveTo(saveUrl);
                }
                return "success";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
复制代码

2、RenamingMultipartFormDataStreamProvider 类:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using System.IO;

namespace Test.One.Common
{
    public class RenamingMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
    {
        /// <summary>
        /// 文件重命名
        /// </summary>
        /// <param name="root"></param>
        public RenamingMultipartFormDataStreamProvider(string root)
            : base(root)
        {
        }
        /// <summary>
        /// 文件重命名
        /// </summary>
        /// <param name="headers"></param>
        /// <returns></returns>
        public override string GetLocalFileName(HttpContentHeaders headers)
        {
            string fileName = headers.ContentDisposition.Name;
            if (!string.IsNullOrWhiteSpace(fileName))
            {
                fileName = Guid.NewGuid().ToString();
            }
            return fileName.Replace("\"", string.Empty);
        }
    }
}
复制代码

 

3、html 模拟代码:

复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <h1>柠檬伙伴云</h1>
    <form action="/Test/Upload2" method="post" enctype="multipart/form-data">

        <input type="file" name="f1"  /> <br /><br />
        <input type="file" name="f2" /> <br /><br />
   
        <input type="submit"  value="上传图片" /> 
        
    </form>
</body>
</html>
复制代码

3、效果:

 

实例二:

api:

复制代码
   /// <summary>
        /// TestFile
        /// </summary>
        /// <returns></returns>
        [HttpPost,Route("TestFile")]
        public async Task<Result<bool>> TestFile()
        {
            Result<bool> result = new Result<bool>();
            try
            {
                if (!Request.Content.IsMimeMultipartContent())
                {
                    result.ReturnCode = ResultCode.InvalidParam;
                    result.Data = false;
                    result.ReturnMsg = "请求数据不是multipart/form-data类型";
                    return result;
                }

                string root = HostingEnvironment.MapPath("/Resources/Templet/");
                string date = DateTime.Now.ToString("yyyy-MM-dd");
                string resourcePath  = Path.Combine(root, date);
                if (!Directory.Exists(resourcePath))
                {
                    Directory.CreateDirectory(resourcePath);
                }

                var provider = new RenamingMultipartFormDataStreamProvider(resourcePath);
                // 接收数据,并保存文件
                var bodyparts = await Request.Content.ReadAsMultipartAsync(provider);

                if (bodyparts.FormData.Count <= 0 || provider.FileData == null && !provider.FileData.Any())
                {
                    result.ReturnCode = ResultCode.InvalidParam;
                    result.Data = false;
                    result.ReturnMsg = "文件或参数不全,视频上传失败。";
                    return result;
                }

                UploadContactListFileModel uploadModel = new UploadContactListFileModel();

                if (bodyparts.FormData.AllKeys.Contains("ContactListName"))
                {
                    uploadModel.ContactListName = bodyparts.FormData["ContactListName"];
                }

                foreach (MultipartFileData file in provider.FileData)
                {
                    //上传的文件名
                    string name = file.Headers.ContentDisposition.FileName.Replace("\"", "");
                    string extension = Path.GetExtension(name);
                    if (extension == ".csv" || extension == ".xls" || extension == ".xlsx")
                    {
                        //修改文件名
                        string newFileName = Guid.NewGuid().ToString("N") + Path.GetExtension(name);
                        string uploadPath = Path.Combine(resourcePath, newFileName);
                        //保存文件
                        File.Move(file.LocalFileName, uploadPath);
                        uploadModel.FilePath = uploadPath;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                result.ReturnMsg = "服务器内部发生异常";
                Logger.Error("SelfsController[AddVideos]", ex);
            }
            return result;
        }
复制代码

model:

复制代码
 public class UploadContactListFileModel
    {
        
        /// <summary>
        /// FilePath
        /// </summary>
        public string FilePath { get; set; }

        /// <summary>
        /// ContactListName
        /// </summary>
        public string ContactListName { get; set; }

        /// <summary>
        /// IsError
        /// </summary>
        /// <returns></returns>
        public bool IsError()
        {
            return string.IsNullOrEmpty(FilePath) || string.IsNullOrEmpty(ContactListName);
        }
    }
复制代码

html:

  <form action="/Spread/External/TestFile" method="post" enctype="multipart/form-data">
            <input type="text" name="ContactListName" value="ContactListName" /> <br />
            <input type="file" name="upload" value="" /><br />
            <input type="submit" name="name" value="上传" />
        </form>

 

PS:  碰到 “MIME 多节流出现意外的结尾。MIME 多节消息不完整”

 

<input type="file" id="fileInput" name="fileInput"/>

input[type] 必须有name属性。

<input type="file" id="fileInput" name="fileInput"/>
posted @   大空白纸  阅读(21501)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示