WebApi的文件上传功能实现

37 篇文章 0 订阅

 

1.自主宿主HttpSelfHost的实现

#region Web Api监听
            Assembly.Load("Lind.DDD.TestApi");  //手工加载某个api程序集的controller
            var config = new HttpSelfHostConfiguration("http://localhost:3333");
            config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
            var server = new HttpSelfHostServer(config);
            server.OpenAsync().Wait();
            Console.WriteLine("Server is opened");
   #endregion

也可使用如下方式注册路由

public class RouteConfig
    {
        public static void RegisterRoutes(HttpRouteCollection httpRouteCollection)
        {
            httpRouteCollection.MapHttpRoute(    //配置路由
                    "API Default", "api/{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index", id = RouteParameter.Optional });
        }
    }

其中的config可以进行配置

public class HttpSelfHostConfiguration : HttpConfiguration
    {
        public HttpSelfHostConfiguration(string baseAddress);
        public HttpSelfHostConfiguration(Uri baseAddress);

        public Uri BaseAddress { get; }
        public HttpClientCredentialType ClientCredentialType { get; set; }
        public HostNameComparisonMode HostNameComparisonMode { get; set; }
        public int MaxBufferSize { get; set; }
        public int MaxConcurrentRequests { get; set; }
        public long MaxReceivedMessageSize { get; set; }
        public TimeSpan ReceiveTimeout { get; set; }
        public TimeSpan SendTimeout { get; set; }
        public TransferMode TransferMode { get; set; }
        public System.IdentityModel.Selectors.UserNamePasswordValidator UserNamePasswordValidator { get; set; }
        public System.IdentityModel.Selectors.X509CertificateValidator X509CertificateValidator { get; set; }

        protected virtual BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding);
    }

config.MaxReceivedMessageSize = int.MaxValue;
config.TransferMode = TransferMode.Buffered;

上述两项配置可以实现不限制文件大小上传。

2. 实现上传功能的WebApi

[HttpPost]
        public RestResult Upload()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            try
            {
                var provider = new MultipartFormDataStreamProvider(PacsEnvironment.PacsTemperature);
                var task = Request.Content.ReadAsMultipartAsync(provider);
                task.Wait();
                foreach (var f in provider.FileData)
                {
                    Logger.ErrorWithFormat("filename:{0}", f.Headers.ContentDisposition.FileName);
                    Logger.ErrorWithFormat("{0}", f.LocalFileName);
                }
                return "";
            }
            catch (System.Exception e)
            {
                return "";
            }

            return "";
        }

 测试工程:

class Program
    {
        static void Main(string[] args)
        {
            string fileName = string.Empty;
            while (true)
            {
                Console.Write("input:");
                fileName = Console.ReadLine();
                if (!File.Exists(fileName))
                    continue;


                WebClient client = new WebClient();
                byte[] bytes = client.UploadFile("http://ip:端口/api/Image/UploadAndStoreDicom", fileName);

                string str = System.Text.Encoding.UTF8.GetString(bytes);

                Console.WriteLine(str);
            }


        }
    }

网上比较完整的用法

public class vUploadController : ApiController
{
    public async Task<HttpResponseMessage> Post()
    {
        //检查POST的是否为MultiPart
        if(!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        //准备CustomMultipart格式的数据流的提供者
        //数据将会被加载
        string fileSaveLocation = HttpContext.Current.Server.MapPath("~/App_Data");
            CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation);
            List<string> files = new List<string>();
 
            try
            {
                // Read all contents of multipart message into CustomMultipartFormDataStreamProvider.
                await Request.Content.ReadAsMultipartAsync(provider);
 
                foreach (MultipartFileData file in provider.FileData)
                {
                    files.Add(Path.GetFileName(file.LocalFileName));
                }
 
                // Send OK Response along with saved file names to the client.
                return Request.CreateResponse(HttpStatusCode.OK, files);
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }
    }
 
    // We implement MultipartFormDataStreamProvider to override the filename of File which
    // will be stored on server, or else the default name will be of the format like Body-
    // Part_{GUID}. In the following implementation we simply get the FileName from 
    // ContentDisposition Header of the Request Body.
    public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
    {
        public CustomMultipartFormDataStreamProvider(string path) : base(path) { }
 
        public override string GetLocalFileName(HttpContentHeaders headers)
        {
            return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        }
    }

不存文件到服务器的方式(鸡肋,存了我也可以删除)

下面的代码直接从请求的Content中读取请求数据,得到MultipartMemoryStreamProvider对象,遍历该对象的Contents属性,可以得到包含上传文件及form表单数据的HttpContent对象。如何从Contents找到包含文件数据的HttpContent对象,可以根据HttpContent对象头部中对应的FileName属性来判断,这个需要和前端约定好,文件数据必须传入文件名称。
 

var multipartMemoryStreamProvider = await Request.Content.ReadAsMultipartAsync();
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var content in multipartMemoryStreamProvider.Contents)
{
    if (!string.IsNullOrEmpty(content.Headers.ContentDisposition.FileName))
    {
        using (Stream stream = await content.ReadAsStreamAsync())
        {
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
        }
    }
    else
    {
       string val = await content.ReadAsStringAsync();
       dic.Add(content.Headers.ContentDisposition.Name, val);
    }      
}

 

Web API文件上传功能是指通过Web API实现用户将文件上传到服务器的功能。这个功能通常用于网站或应用程序中,用户可以通过上传文件来实现文件分享、存储或进行其他操作。 要实现Web API文件上传功能,可以遵循以下步骤: 1. 定义文件上传API端点:首先,需要在Web API中定义一个文件上传API端点。这个端点将接收用户上传的文件。 2. 处理文件上传请求:当用户调用文件上传API时,服务器将接收到上传请求。服务器应该解析请求的内容,提取出上传的文件,并对文件进行有效性校验。其中,有效性校验可以包括文件类型、大小等检查,以确保安全性和可靠性。 3. 文件保存与存储:一旦服务器验证通过,就需要将文件保存到指定的位置。这个位置可以是服务器的本地存储,也可以是云存储。保存文件时,可以给文件分配一个唯一的标识符,方便在其他地方进行引用和查找。 4. 返回上传结果:上传成功后,服务器应该向客户端返回上传结果。这个结果可以包括文件的URL、文件保存路径等信息。客户端可以根据这些信息来进行后续的操作,比如展示上传成功的提示,或者生成文件的下载链接等。 5. 错误处理:在文件上传过程中,可能会遇到各种错误,比如上传超时、文件大小超过限制等。服务器应该对这些错误情况进行处理,返回相应的错误提示给客户端。 总的来说,Web API文件上传功能是一个将用户上传的文件保存到服务器的过程。通过定义API端点、处理上传请求、保存文件以及返回上传结果,可以实现这个功能,并提供更好的用户体验和功能扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值