C# 一个webapi接口,接收来自其它软件传过来的文件,实现文件上传功能。

C# 一个webapi接口,接收来自其它软件传过来的文件,实现文件上传功能。

这是个例子 接收上传文件流+存储到本地 代码是.net 5下实现的 , 其他的环境下大同小异

 [Route("~/file/upload/{Id}")]
 public JsonResult Upload()
  {
            try
            {
                var file = Request.Form.Files.FirstOrDefault();
                if (file is null)
                {
                    return new JsonResult(new { success = 0, message = "不能提交空文件" });
                }
                string FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{Guid.NewGuid()}.jpg"); //文件存储地址
                using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    using (Stream stream = file.OpenReadStream())
                    {
                        stream.CopyTo(fs);
                    }
                }
                return new JsonResult(new { success = 1, message = "上传成功", url = FileName });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { success = 500, message = ex.Message });
            }
        }

 /// <summary>
        /// POST api/FileManager/PostFormData
        /// </summary>
        /// <returns></returns>
        [ActionName("PostFormData")]
        [HttpPost]
        public async Task<HttpResponseMessage> PostFormData()
        {
            // Check if the request contains multipart/form-data.
            // 检查该请求是否含有multipart/form-data
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
            string root = HttpContext.Current.Server.MapPath(PortraitApp);
            var provider = new MultipartFormDataStreamProvider(root);

            try
            {
                // Read the form data.
                // 读取表单数据
                await 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);
                }
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }

        /// <summary>
        /// POST api/FileManager/PostFormFile
        /// </summary>
        /// <returns></returns>
        [ActionName("PostFormFile")]
        [HttpPost]
        public IHttpActionResult PostFormFile()
        {
            try
            {
                if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp)))
                {
                    Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp));
                }

                HttpFileCollection files = HttpContext.Current.Request.Files;
                string name = "";
                foreach (string key in files.AllKeys)
                {
                    HttpPostedFile file = files[key];

                    if (string.IsNullOrEmpty(file.FileName) == false)
                    {
                        int length = file.ContentLength;
                        if (length>2097152)
                        {
                            throw new CustomException("上传文件超过2M,请将上传文件大小控制在2M内,谢谢");
                        }
                        string extension = file.FileName.Substring(file.FileName.LastIndexOf('.')).ToLower();
                        if (extension!=".bmp"&& extension != ".jpg" && extension != ".jpeg" && extension != ".png")
                        {
                            throw new CustomException("上传文件扩展名不正确,请上传bmp,jpg,jpeg,png格式的图片");
                        }

                        name = DateTime.Now.ToStringByDatetime(DateTimeType.yyyyMMddHHmmss) + extension;
                        //LoginVerifyModels usermodel = GetVerifyModel();
                        string username = GetVerifyString();
                        if (!string.IsNullOrEmpty(username))
                        {
                            name = username + extension; 
                        }
                        file.SaveAs(HttpContext.Current.Server.MapPath(PortraitApp) + name);

                    }
                }

                return Json(Success(new { ImgPath = RetureTemp + name }));
            }
            catch (CustomException ce)
            {
                return Json(getException(ce.Message));
            }
            catch (Exception ex)
            {
                return Json(getException(ex));
            }
        }
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
    string  fileHtml="";
    protected void Page_Load(Object sender, EventArgs e)
    {
        var savePath = Server.MapPath("/upload/");//文件保存路径,网站根目录upload文件夹下
        var op = Request.QueryString["op"];
        if (op == "upload")
        { //上传操作
            var file = Request.Files["file"];
            if (file != null)
            {
                var ext = Path.GetExtension(file.FileName).Substring(1).ToLower();
                if (new[] { "jpg", "jpeg", "gif", "png" }.Contains(ext))
                {
                    var fn = Path.GetFileName(file.FileName);
                    int i = 1;
                    while (File.Exists(savePath + fn))
                    {
                        fn = fn.Replace((i == 1 ? "" : i.ToString()) + ".", "-" + i + ".");
                        i++;
                    }
                    file.SaveAs(savePath + fn);
                    Response.Write("文件保存成功");
                }
            }
        }
        else if (op == "download")
        {//下载操作 
            var fn = Request.QueryString["fn"];
            if (!string.IsNullOrEmpty(fn) && File.Exists(savePath + fn))
            {
                Response.AddHeader("content-disposition", "attachment;filename=\"" + fn + "\"");
                Response.TransmitFile(savePath + fn);
                Response.End();
            }
        }
 
 
        //读取文件夹文件显示操作
        fileHtml = String.Join("", Directory.GetFiles(savePath).Select(i => "<div><a href='?op=download&fn=" + Server.UrlDecode(Path.GetFileName(i)) + "'>"+Path.GetFileName(i)+"</a></div>"));
        this.DataBind();
 
    }
</script>
<script>
    function check(f) {
        if (!/(jpe?g|png|gif)$/.test(f.file.value)) { alert('只允许上传图片文件!'); return false;}
    }
</script>
<form method="post" action="?op=upload" enctype="multipart/form-data" onsubmit="return check(this)">
    选择文件:<input type="file" name="file" accept="image/*" /><input type="submit" value="上传文件" />
</form>
<div>点击下载文件
    <%#fileHtml %>
</div>


一般情况,我都是使用asp.net的一般处理程序(.ashx)进行负责接收文件。发送端一般都是通过浏览器、System.Net.WebClient的UploadData方法或其他的发送文件(大同小异吧)。

下面是发送和接收简单代码。

接收图片:


<%@ WebHandler Language="C#" Class="ReceiveScreen" %>

#region 命名空间
using System;
using System.Web;
using System.IO;
#endregion

public class ReceiveScreen : IHttpHandler
{
    #region 进程请求
    public void ProcessRequest(HttpContext context)
    {
        string OperaType = context.Request.Params["opera"].ToString();
        if (OperaType == "getscreen")
        {
            this.SaveScreenPicture(context);
        }
    }
    #endregion

    #region 保存截屏
    private void SaveScreenPicture(HttpContext context)
    {
        try
        {
            Stream streamObj = context.Request.InputStream;
            string floderPath = HttpContext.Current.Server.MapPath("~/");
            string fileName = context.Request.Params["clientid"].ToString();
            File.WriteAllBytes(floderPath + "Screen\\" + fileName + ".jpg", this.StreamToByteArray(streamObj));
            context.Response.Write("上传成功");
        }
        catch
        {
            //
        }
    }
    #endregion

    #region 字节流转换
    public byte[] StreamToByteArray(Stream stream)
    {
        byte[] bytes = new byte[stream.Length];
        stream.Read(bytes, 0, bytes.Length);
        stream.Seek(0, SeekOrigin.Begin);
        return bytes;
    }
    #endregion
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

发送图片:

        #region 上传文件
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="receiveFileUrl">接收文件URL(http://....)</param>
        /// <param name="uploadFile">上传文件地址(D:\....)</param>
        public static bool UploadHttpFile(string receiveFileUrl, string uploadFile)
        {
            bool isOk = false;
            try
            {
                System.Net.WebClient webClient = null;
                webClient = new System.Net.WebClient();
                byte[] resultBuffer = webClient.UploadData(receiveFileUrl, File.ReadAllBytes(uploadFile));
                string result = WinBaseClass.ByteArrayToStringUTF8(resultBuffer);
                isOk = result == "上传成功" ? true : false;
            }
            catch
            {
                isOk = false;
            }
            return isOk;
        }
        #endregion

参考下https://download.csdn.net/download/yiwenbiao68/9559369

https://ask.csdn.net/questions/7526737?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1.pc_feed_download_top3ask