C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#文件上传和接收

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

作者:小码编匠

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#文件上传和接收的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文