开发者

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

开发者 https://www.devze.com 2025-08-05 10:42 出处:网络 作者: 小码编匠
目录前言文件上传的核心实现一、效果展示二、服务端代码三、客户端代码方式一方式二总结前言
目录
  • 前言
  • 文件上传的核心实现
    • 一、效果展示
    • 二、服务端代码
    • 三、客户端代码
      • 方式一
      • 方式二
  • 总结

    前言

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

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

    文件上传的核心实现

    一、效果展示

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

    Postman测试

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

    服务端接收

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

    上传成功

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

    二、服务端代码

    服务端采用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), "f编程ile", 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 =android new phpMultipartFormDataContent();
            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.pythonWait(); // 等待异步操作完成
                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#文件上传和接收的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号