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#实现简单打字小游戏

    C#实现简单打字小游戏

    这篇文章主要为大家详细介绍了C#实现简单打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#简单发送email的方法

    C#简单发送email的方法

    这篇文章主要介绍了C#简单发送email的方法,涉及C#发送Email的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#执行js动态编译的方法

    C#执行js动态编译的方法

    这篇文章主要介绍了C#执行js动态编译的方法,是涉及动态编译脚本非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • VS2015为console.readkey添加代码片段的方法

    VS2015为console.readkey添加代码片段的方法

    这篇文章主要介绍了VS2015为console.readkey添加代码片段的方法,需要的朋友可以参考下
    2016-12-12
  • C#文件操作、读取文件、Debug/Trace类用法

    C#文件操作、读取文件、Debug/Trace类用法

    这篇文章介绍了C#文件操作、读取文件、Debug/Trace类的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#如何实现dataGridView动态绑定数据

    C#如何实现dataGridView动态绑定数据

    这篇文章主要介绍了C#如何实现dataGridView动态绑定数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C#利用NPOI操作Excel(单元格设置)

    C#利用NPOI操作Excel(单元格设置)

    这篇文章主要为大家详细介绍了C#利用NPOI操作Excel实现单元格设置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • .Net Winform开发笔记(四)透过现象看本质

    .Net Winform开发笔记(四)透过现象看本质

    本文将从Winform应用程序中的Program.cs文件的第一行代码开始逐步分析一个Winform应用程序到底是怎样从出生走向死亡
    2013-01-01
  • 基于C#编写经理评分系统

    基于C#编写经理评分系统

    最近接了这样一个项目,要求使用c#编写经理评分系统,需求,要显示员工信息,实现项目经理给员工评分功能,今天小编分步骤给大家介绍,需要的的朋友参考下
    2017-03-03
  • C#实现缩放字体的方法

    C#实现缩放字体的方法

    这篇文章主要介绍了C#实现缩放字体的方法,涉及C#操作Matrix实现字体缩放的相关技巧,需要的朋友可以参考下
    2015-06-06

最新评论