C#实现文件上传和接收功能

 更新时间:2025年08月04日 10:45:53   作者:小码编匠  
Web应用开发中,文件上传是一个常见且重要的功能,它不仅涉及到前端用户界面的设计,还涉及到后端服务器如何高效、安全地处理上传的数据,本文将详细介绍如何基于C#实现文件上传和接收功能,需要的朋友可以参考下

前言

Web应用开发中,文件上传是一个常见且重要的功能。它不仅涉及到前端用户界面的设计,还涉及到后端服务器如何高效、安全地处理上传的数据。

本文将详细介绍一种基于ASP.NET Web API的服务端解决方案以及两种不同的客户端实现方法,帮助开发者更好地理解和实现文件上传功能。

文件上传的核心实现

一、效果展示

通过以下截图可以直观地看到整个文件上传过程的效果:

Postman测试

服务端接收

上传成功

二、服务端代码

服务端采用ASP.NET Web API来处理文件上传请求,以下是核心代码片段:

using System;
using System.IO;
using System.Web;
using System.Web.Http;

namespace Mes.Controllers
{
    public class FileController : ApiController
    {
        [HttpPost]
        public string UploadFile()
        {
            string result = string.Empty;
            try
            {
                // 核心部分 文件
                string fileName = HttpContext.Current.Request.Files[0].FileName;
                Stream stream = HttpContext.Current.Request.Files[0].InputStream;

                // 参数
                var forms = HttpContext.Current.Request.Form;
                foreach (var item in forms)
                {
                    string val = forms[item.ToString()];
                }
                // 保存路径
                string uploadFolder = "F:\\图片";
                string savePath = System.IO.Path.Combine(uploadFolder, fileName);
                FileStream fsWrite = new FileStream(savePath, FileMode.Create);

                byte[] bytes = new byte[1024 * 4];
                int total = 0;
                int size = 0;
                do
                {
                    // 注意第二个参数是在buffer中的偏移量,不是在文件中的偏移量
                    size = stream.Read(bytes, 0, bytes.Length);
                    fsWrite.Write(bytes, 0, size);
                    total += size;
                }
                while (size > 0);

                fsWrite.Close();
                result = "true";
            }
            catch (Exception ex)
            {
                result = ex.Message;
            }
            return result;
        }
    }
}

三、客户端代码

客户端提供了两种方式来上传文件,分别是通过表单(multipart/form-data)的方式一和方式二。

方式一

public string PostFile(string url, Dictionary<string, object> dics, string filePath)
{
    // 返回结果
    string result = string.Empty;
    try
    {
        MultipartFormDataContent form = new MultipartFormDataContent();
        using (HttpClient client = new HttpClient())
        {
            MediaTypeWithQualityHeaderValue temp = new MediaTypeWithQualityHeaderValue("application/json") { CharSet = "utf-8" };
            client.DefaultRequestHeaders.Accept.Add(temp);//设定要响应的数据格式

            // 参数
            foreach (var keyValuePair in dics)
            {
                form.Add(new StringContent(keyValuePair.Value.ToString()), keyValuePair.Key);
            }

            // 读取文件
            Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            var fileName = Path.GetFileName(filePath);

            // 设定文件类型表单项,使用StreamContent存放文件流
            form.Add(new StreamContent(fileStream), "file", fileName);

            Task<HttpResponseMessage> task = client.PostAsync(url, form);
            task.Wait(); // 等待异步操作完成
            HttpResponseMessage response = task.Result;
            response.EnsureSuccessStatusCode(); // 确保响应状态码表示成功

            string responseBody = task.Result.Content.ReadAsStringAsync().Result;
            Console.WriteLine(responseBody);
            result = responseBody;
        }
        return result;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

方式二

public string PostFile(string url, Dictionary<string, object> dics, string filePath)
{
    // 返回结果
    string result = string.Empty;
    try
    {
        MultipartFormDataContent form = new MultipartFormDataContent();
        using (HttpClient client = new HttpClient())
        {
            MediaTypeWithQualityHeaderValue temp = new MediaTypeWithQualityHeaderValue("application/json") { CharSet = "utf-8" };
            client.DefaultRequestHeaders.Accept.Add(temp);//设定要响应的数据格式

            // 参数
            foreach (var keyValuePair in dics)
            {
                form.Add(new StringContent(keyValuePair.Value.ToString()), keyValuePair.Key);
            }

            // 读取文件 读取为字节数据存入
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                byte[] data = new byte[fileStream.Length];
                fileStream.Read(data, 0, data.Length);
                fileStream.Close();

                var fileName = Path.GetFileName(filePath);
                form.Add(new ByteArrayContent(data), "file", fileName);
            }

            Task<HttpResponseMessage> task = client.PostAsync(url, form);
            task.Wait(); // 等待异步操作完成
            HttpResponseMessage response = task.Result;
            response.EnsureSuccessStatusCode(); // 确保响应状态码表示成功

            string responseBody = task.Result.Content.ReadAsStringAsync().Result;
            Console.WriteLine(responseBody);
            result = responseBody;
        }
        return result;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

总结

本文详细介绍了如何利用ASP.NET Web API实现文件上传功能,并提供了两种不同风格的客户端实现方法。通过这种方式,不仅可以有效提高项目的可维护性和灵活性,还能确保文件上传的安全性与效率。

以上就是C#实现文件上传和接收功能的详细内容,更多关于C#文件上传和接收的资料请关注脚本之家其它相关文章!

相关文章

  • C# WebApi 接口返回值不困惑:返回值类型详解

    C# WebApi 接口返回值不困惑:返回值类型详解

    这篇文章主要介绍了C# WebApi 接口返回值不困惑:返回值类型详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Unity3D实现模型随机切割

    Unity3D实现模型随机切割

    这篇文章主要为大家详细介绍了Unity3D实现模型随机切割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C#递归算法寻找数组中第K大的数

    C#递归算法寻找数组中第K大的数

    首先将向量V从中间位置分开,分成左和右,分好后,中间值的索引如果恰恰等于K,就找到了,否则如果中间元素索引大于K,则在左子表中继续查找,忽略右子表,如果中间值索引小于K,则在右子表中继续查找,如此循环往复。
    2016-06-06
  • C# Process.Start()系统找不到指定文件的问题分析及解决

    C# Process.Start()系统找不到指定文件的问题分析及解决

    文章内容:文章描述了由于系统找不到可启动的exe文件,路径出现问题导致无法启动应用程序的情况,作者通过修改应用程序的启动路径,将路径中的“\\”改为“\”,从而解决了路径问题,使应用程序能够正常启动
    2025-11-11
  • C#动态创建button按钮的方法实例详解

    C#动态创建button按钮的方法实例详解

    这篇文章主要介绍了C#动态创建button按钮的方法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C#Winform窗口移动方法

    C#Winform窗口移动方法

    今天小编就为大家分享一篇C#Winform窗口移动方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 在C#中读取CPU、硬盘和内存温度的完整代码

    在C#中读取CPU、硬盘和内存温度的完整代码

    系统监控工具或性能分析应用时,实时获取硬件信息(如 CPU、硬盘和内存的温度)是一个常见且重要的需求,本文将详细介绍如何在 C# 项目中集成并使用 Open Hardware Monitor 库,以实现对 CPU、硬盘以及内存温度的监控,需要的朋友可以参考下
    2025-06-06
  • CPF 使用C#的Native AOT 发布程序的详细过程

    CPF 使用C#的Native AOT 发布程序的详细过程

    这篇文章主要介绍了CPF 使用C#的Native AOT 发布程序,本文给大家介绍的非常详细,对大家的学习或工作具体一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 分享我在工作中遇到的多线程下导致RCW无法释放的问题

    分享我在工作中遇到的多线程下导致RCW无法释放的问题

    最近在做项目中遇到一个问题,在调用一个类库中的方法时,出现如下异常信息:尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在使用的 RCW 的尝试会导致损坏或数据丢失
    2015-12-12
  • C#服务器NFS共享文件夹搭建与上传图片文件的实现

    C#服务器NFS共享文件夹搭建与上传图片文件的实现

    本文主要介绍了C#服务器NFS共享文件夹搭建与上传图片文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论