webapi 实现上传图片接口开发_c# webapi 接口 图片上传 - CSDN
精华内容
参与话题
  • WebApi的文件上传功能实现

    千次阅读 2018-11-05 20:09:52
    1.自主宿主HttpSelfHost...#region Web Api监听 Assembly.Load("Lind.DDD.TestApi"); //手工加载某个api程序集的controller var config = new HttpSelfHostConfiguration("http://localhost:3333...

     

    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);
        }      
    }
    

     

    展开全文
  • 找了好多天都没找到小程序批量上传图片的方法,然后我现在的逻辑是: 取到上传图片的集合,循环调用小程序wx.UploadFile方法,依次上传 后端取到文件之后生成唯一MD5码(相同的文件生成的MD5码是唯一的),然后取...

    找了好久都没找到合适的小程序批量上传图片的方法,最终还是只能循环上传,就自己扣了一个:
    思路:

    1. 调用小程序上传图片接口后(API参考小程序开发文档,很详细),取到上传图片的集合,循环调用小程序wx.UploadFile方法,依次上传
    2. 后端取到文件之后生成唯一MD5码(相同的文件生成的MD5码是唯一的),然后取前两位后两位创建文件夹,保存图片前判断下图片是否存在。(这样一个完全相同的图片就不会被重复被保存在服务器上了)
    3. 把每次上传后端API接口返回的MD5和文件后缀名,以逗号分隔拼成字符串。所有的文件上传完成之后,请求APi接口,批量保存在数据库TB_File表中;
    4. 以后调用时通过生成MD5的逻辑截取路径取图片,我这里取的前两位后两位

    Api代码:

    [HttpPost]
            public IHttpActionResult SaveImages2()
            {
                HttpPostedFile file = HttpContext.Current.Request.Files["file"];//接收
                string ext = Path.GetExtension(file.FileName);//文件后缀名
                Stream s = file.InputStream;//文件流
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] retVal = md5.ComputeHash(s);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < retVal.Length; i++)
                {
                    sb.Append(retVal[i].ToString("x2"));
                }
                string md5Res = sb.ToString();//上面的代码是为了生成文件唯一的MD5码
                string path = md5Res .Substring(0, 2);
                string path1=md5Res .Substring(md5Res .Length - 2, 2)//取MD5的前两位和后两位生成文件夹,把图片存在后两位的文件夹内
                string fileSaveLocation = $"E:\\CoolSchoolImages\\{path}\\{path1}\\{md5Res }.jpg";.//文件最终保存路径
                if (!File.Exists(fileSaveLocation))//判断文件是否存在
                {//若不存在
                    Directory.CreateDirectory($"E:\\CoolSchoolImages\\{path}\\{path1}");//这个方法创建文件夹的时候如果文件夹存在的话就不会创建了,所以不管文件有没有都调用一下,省得写那么多判断
                    file.SaveAs(fileSaveLocation);保存文件
                }
                return Ok(md5Res +ext);返回MD5码,用于后面保存在数据库
            }
    

    小程序部分代码
    这里的imgUrls是选择的图片数组,后面把返回的文件名加逗号拼接成了字符串,用于后面保存到数据库
    在这里插入图片描述

    展开全文
  • using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Net.Http;...using System.Web.Http; using Newtonsoft.Json; using System.Thread
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Text;

    namespace webapitest.Controllers
    {
        public class testController : ApiController
        {
            public class postbody
            {
                public string token { get; set; }
            }


            [System.Web.Http.HttpPost]
            public string UploadFile()
            {
                System.Web.HttpContext context = System.Web.HttpContext.Current;

                string str = "{";
                int c = context.Request.Form.Count;
                for (int i=0;i<c;i++)//提取除文件外的其他参数
                {
                    str +=string.Format("\"{0}\":\"{1}\",", context.Request.Form.AllKeys[i], context.Request.Form[i]);               
                }
                str = str.TrimEnd(',') + "}";
                postbody token = JsonConvert.DeserializeObject<postbody>(str);
                if (token.token != "123")
                    return "invalid token";
                if (context.Request.Files.Count == 0)//判断文件是否存在
                    return "no such files";

                context.Request.Files[0].SaveAs(context.Server.MapPath("~/upfiles/") + context.Request.Files[0].FileName);//保存文件,此处跟普通MVC一样
                return "fileSaved";


        //下面这个方法也可以,不过我不太喜欢这种方式

                //if (!Request.Content.IsMimeMultipartContent())
                //    return "UnsupportedMediaType";

                //var provider = new MultipartFormDataStreamProvider(context.Server.MapPath("~/upfiles"));
                //try
                //{
                //    // Read the form data.  
                //    Request.Content.ReadAsMultipartAsync(provider);


                //    // This illustrates how to get the file names.  
                //    foreach (MultipartFileData file in provider.FileData)
                //    {//接收文件  
                //        Trace.WriteLine(file.Headers.ContentDisposition.FileName);//获取上传文件实际的文件名  
                //        Trace.WriteLine("Server file path: " + file.LocalFileName);//获取上传文件在服务上默认的文件名  
                //    }//TODO:这样做直接就将文件存到了指定目录下,暂时不知道如何实现只接收文件数据流但并不保存至服务器的目录下,由开发自行指定如何存储,比如通过服务存到图片服务器  

                //}
                //catch (Exception e)
                //{
                //    return e.Message;
                //}

            }
        }
    }
    展开全文
  • Web车牌识别中API接口的调用

    千次阅读 2017-11-29 17:59:29
    该软件可部署在私有服务器中(私有本地服务器或云服务器均可),APP和业务系统可通过web service接口调用该识别服务,设备端只负责拍摄图像后上传上传到已部署Web Service车牌识别软件的服务器中进行识别,识别...

    Web Service车牌识别就是服务器版车牌OCR识别软件,属于后端识别,Web Service车牌识别软件目前支持WindowsLinux等主流服务器操作系统。

    该软件可部署在私有服务器中(私有本地服务器或云服务器均可),APP和业务系统可通过web service接口调用该识别服务,设备端只负责拍摄图像后上传,上传到已部署Web Service车牌识别软件的服务器中进行识别,识别完成后再返回标准的XML数据。整个识别过程和我公司没有任何交互,均在企业自有的服务器上完成识别。

    服务主要功能描述

    识别服务API主要实现了以下功能:

    1) 通过http协议post方法上传各种证件彩色图像文件(包括二代身份证正面,二代身份证背面,驾照、行驶证、银行卡、名片、车牌、人脸对比、护照、军官证、回乡证、港澳通行证、一代身份证等)通过http接口进行识别;

    2) 将识别结果以XMLjson格式返回给用户;

    核验服务API主要实现了以下功能:

    1) 通过http协议post方法上传指定参数和图片,通过http接口进行核验;

    2) 将核验结果以XMLjson格式返回给用户;

    如需了解跟多信息请见账号某角落或【度娘搜索“车牌识别@赵硕”获取】;


    展开全文
  • 由于浏览器的安全性限制,无法在浏览器中直接访问本地路径下的文件,包括图片文件、...AnyChat内置的Web服务器默认是关闭状态,需要在初始化SDK成功之后通过如下的API接口打开: BRAC_SetSDKOption(BRAC_SO_
  • 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的。 而且这次的代码改动较大,与原来的...
  • 调用微信JS-SDK接口上传图片

    万次阅读 多人点赞 2020-07-04 18:54:13
    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存,...
  • 我用jeesite搭建的web开发,一部分是后台管理,一部分是为app提供接口,app接口有一个图片上传的功能,我这提供了一个接口,/api/xxxx,不会被jeesite框架拦截验证,然后我自己写了一个post提交文件,tomcat后台处理...
  • ASP.NET WebApi 图片上传

    千次阅读 2018-04-08 11:23:29
    解决的方法:(2)主要原因没有理解Web项目的本质:浏览器相当于客户端,当客户端向服务器端提交上传文件时(注意:基于前后端分离开发,客户端调用远程服务上传图片和文件),被上传的文件路径虽然提交到了服务器端,...
  • Java和web方向的学习路线

    万次阅读 多人点赞 2018-02-16 10:47:37
    Javaweb系统学习路线:Java系统学习路线:第一阶段技术名称第一阶段: Java ...(重点)J2SE(java基础部分)java开发前奏计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程...
  • 一个很简单的功能,当我做到需要上传图片到后台的时候,突然感觉对上传文件的思路很乱,不知该使用什么方式来实现。所以今天小编我来总结上传文件的几种方式,屡屡自己的思路。  二、常用的几种方式  1、使用...
  • Java接口实现文件上传

    千次阅读 2019-05-09 12:51:25
    因工作需要,在后台管理页面加入一个上传文件的模块,虽然接口的代码很简单,但实现期间遇到了一些比较有趣的坑,特记录下来。 需求 实现文件上传,并提供一个可供下载的路径。 想法 文件上传代码暂且不谈,先说说...
  • 增值税发票快速识别API接口

    万次阅读 2018-08-29 15:59:15
    增值税普通发票只是API, 二维码扫描,二维码识别接口 基本场景: 在不少的票据管理系统中,会需要终端用户通过扫描或者拍照的形式把手头的增值税发票的电子版上传到业务系统中。然后,系统需要对该发票的基本字段...
  • Go 语言开发必须知道的 17 种利器

    千次阅读 2018-08-15 11:33:21
    本期为大家精选了码云上优秀的 Go 语言开源项目,涵盖了文件服务系统、Web 开发框架、游戏服务器开发框架、API 工具、验证码、数据库、爬虫工具、端口转发工具等各个方面,希望能够给大家带来一点帮助:) ...
  • 5分钟搞定图片鉴黄web应用!

    千次阅读 2018-07-28 09:56:00
    通过函数工作流,开发者无需配置和管理服务器,只需关注业务逻辑,编写函数代码,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统,并按实际运行消耗的资源计费。极大地提高了开发和运维效率,减小了...
  • 营业执照识别api接口调用OCR识别

    千次阅读 2017-08-28 13:22:41
    营业执照识别api开发的一款基于服务器平台的营业执照OCR识别服务程序,支持主流Windows、Linux 服务器平台。上传营业执照图像在服务器端完成识别后,返回标准XML识别结果。 企业可将该识别服务部署在自有...
  • API是获取网络服务最便捷的方式,合理地使用API开发项目可以大大提高开发效率,把精力都集中在程序的业务逻辑之上,避免重复造轮子。推荐给大家个人觉得很赞的第三方API(资源整合自网络)。文章分为天气查询、生活...
  • 开发者API资源(接口整理)

    万次阅读 2018-11-14 10:17:56
    API是获取网络服务最便捷的方式,合理地使用API开发项目可以大大提高开发效率,把精力都集中在程序的业务逻辑之上,避免重复造轮子。推荐给大家个人觉得很赞的第三方API(资源整合自网络)。文章分为天气查询、生活...
  • 【史上最全】国内外常用精品API汇总

    万次阅读 多人点赞 2018-08-09 14:56:12
    API是获取网络服务最便捷的方式,合理地使用API开发项目可以大大提高开发效率,把精力都集中在程序的业务逻辑之上,避免重复造轮子。推荐给大家个人觉得很赞的第三方API(资源整合自网络)。文章分为天气查询、生活...
  • 接口测试的一些感悟

    千次阅读 2015-12-16 18:36:36
      接口测试的目的 这个算是老生常谈了,但我觉得只要聊到接口这个还是绕不过的,没有目标就没有评判标准,所以测试的目的还是很重要的。...API testing is a type of software testing that involv
1 2 3 4 5 ... 20
收藏数 21,933
精华内容 8,773
关键字:

webapi 实现上传图片接口开发