C#实现上传下载图片

下面就为您介绍C#实现上传下载图片的完整攻略。

1. 上传图片

1.1 上传图片的基本原理

上传图片其实是将本地计算机的图片文件传输到服务器上。由于HTTP协议是无状态的,因此可以使用POST请求将文件传输到服务器上。

1.2 上传图片的技术实现

在C#中进行上传图片的技术实现,可以通过以下步骤完成:

1.2.1 选择需要上传的图片文件

使用OpenFileDialog控件选择需要上传的图片文件,并获取图片文件的本地路径。

OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "图片文件|*.jpg;*.gif;*.png";
if (dialog.ShowDialog() == DialogResult.OK)
{
    string imagePath = dialog.FileName;
}

1.2.2 将图片文件以二进制流的形式进行上传

使用HttpWebRequest对象,构造POST请求,并设置请求头信息,将本地图片文件以二进制流的形式上传到服务器上。

string url = "http://localhost:8080/upload";
string imagePath = "D:\\test.jpg";
string boundary = "----" + DateTime.Now.Ticks.ToString("x");

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data; boundary=" + boundary;

// 设置请求头信息
StringBuilder headerBuilder = new StringBuilder();
headerBuilder.AppendLine("--" + boundary);
headerBuilder.AppendLine("Content-Disposition: form-data; name=\"imageFile\"; filename=\"" + Path.GetFileName(imagePath) + "\"");
headerBuilder.AppendLine("Content-Type: application/octet-stream");
headerBuilder.AppendLine();

byte[] headerBytes = Encoding.UTF8.GetBytes(headerBuilder.ToString());
byte[] footerBytes = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");

// 构造二进制流
using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(headerBytes, 0, headerBytes.Length);

    using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[1024 * 1024];
        int readLength = 0;
        while ((readLength = fileStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            requestStream.Write(buffer, 0, readLength);
        }
    }

    requestStream.Write(footerBytes, 0, footerBytes.Length);
}

// 获取服务器返回信息
using (WebResponse response = request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader responseReader = new StreamReader(responseStream, Encoding.UTF8))
        {
            string responseText = responseReader.ReadToEnd();
        }
    }
}

1.3 上传图片的实例

下面是一个上传图片的示例:

private void UploadButton_Click(object sender, EventArgs e)
{
    OpenFileDialog dialog = new OpenFileDialog();
    dialog.Filter = "图片文件|*.jpg;*.gif;*.png";
    if (dialog.ShowDialog() == DialogResult.OK)
    {
        string url = "http://localhost:8080/upload";
        string imagePath = dialog.FileName;
        string boundary = "----" + DateTime.Now.Ticks.ToString("x");

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "multipart/form-data; boundary=" + boundary;

        StringBuilder headerBuilder = new StringBuilder();
        headerBuilder.AppendLine("--" + boundary);
        headerBuilder.AppendLine("Content-Disposition: form-data; name=\"imageFile\"; filename=\"" + Path.GetFileName(imagePath) + "\"");
        headerBuilder.AppendLine("Content-Type: application/octet-stream");
        headerBuilder.AppendLine();

        byte[] headerBytes = Encoding.UTF8.GetBytes(headerBuilder.ToString());
        byte[] footerBytes = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(headerBytes, 0, headerBytes.Length);

            using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[1024 * 1024];
                int readLength = 0;
                while ((readLength = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    requestStream.Write(buffer, 0, readLength);
                }
            }

            requestStream.Write(footerBytes, 0, footerBytes.Length);
        }

        using (WebResponse response = request.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (StreamReader responseReader = new StreamReader(responseStream, Encoding.UTF8))
                {
                    string responseText = responseReader.ReadToEnd();
                }
            }
        }
    }
}

2. 下载图片

2.1 下载图片的基本原理

下载图片其实是将服务器上的图片文件下载到本地计算机。由于HTTP协议是无状态的,因此可以使用GET请求将服务器上的文件传输到本地计算机上。

2.2 下载图片的技术实现

在C#中进行下载图片的技术实现,可以通过以下步骤完成:

2.2.1 获取服务器图片文件的基本信息

使用HttpWebRequest对象,构造GET请求,并获取服务器图片文件的基本信息,例如文件名、文件类型等。

string imageUrl = "http://localhost:8080/images/test.jpg";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imageUrl);
request.Method = "HEAD";
using (WebResponse response = request.GetResponse())
{
    string fileName = response.Headers["Content-Disposition"].Substring(response.Headers["Content-Disposition"].IndexOf("=") + 1);
    string fileType = response.ContentType;
    long fileSize = response.ContentLength;
}

2.2.2 将图片文件以二进制流的形式进行下载

使用HttpWebRequest对象,构造GET请求,并以二进制流的形式下载服务器上的图片文件。

string imageUrl = "http://localhost:8080/images/test.jpg";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imageUrl);
request.Method = "GET";
using (WebResponse response = request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            byte[] buffer = new byte[1024 * 1024];
            int readLength = 0;
            while ((readLength = responseStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                memoryStream.Write(buffer, 0, readLength);
            }

            byte[] imageBytes = memoryStream.ToArray();
        }
    }
}

2.3 下载图片的实例

下面是一个下载图片的示例:

private void DownloadButton_Click(object sender, EventArgs e)
{
    string imageUrl = "http://localhost:8080/images/test.jpg";

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imageUrl);
    request.Method = "HEAD";
    using (WebResponse response = request.GetResponse())
    {
        string fileName = response.Headers["Content-Disposition"].Substring(response.Headers["Content-Disposition"].IndexOf("=") + 1);
        string fileType = response.ContentType;
        long fileSize = response.ContentLength;

        request = (HttpWebRequest)WebRequest.Create(imageUrl);
        request.Method = "GET";
        using (WebResponse imageResponse = request.GetResponse())
        {
            using (Stream responseStream = imageResponse.GetResponseStream())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    byte[] buffer = new byte[1024 * 1024];
                    int readLength = 0;
                    while ((readLength = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        memoryStream.Write(buffer, 0, readLength);
                    }

                    byte[] imageBytes = memoryStream.ToArray();

                    using (SaveFileDialog dialog = new SaveFileDialog())
                    {
                        dialog.FileName = fileName;
                        dialog.Filter = fileType + "|*" + Path.GetExtension(fileName);

                        if (dialog.ShowDialog() == DialogResult.OK)
                        {
                            using (FileStream fileStream = new FileStream(dialog.FileName, FileMode.Create))
                            {
                                fileStream.Write(imageBytes, 0, imageBytes.Length);
                            }
                        }
                    }
                }
            }
        }
    }
}

以上就是C#实现上传下载图片的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现上传下载图片 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • c# Newtonsoft 六个值得使用的特性(上)

    C# Newtonsoft 六个值得使用的特性(上) 1. JsonProperty public class User { [JsonProperty("ID")] public int Id { get; set; } [JsonProperty("Name")] public string UserName { …

    C# 2023年5月31日
    00
  • C#实现求一组数据众数的方法

    要实现求一组数据的众数,可以采用以下步骤: 步骤一:读入数据 首先要将一组数据读入程序中,可以使用数组、列表等数据结构来存储数据。 示例代码: int[] data = { 2, 3, 2, 4, 5, 2, 1 }; 步骤二:找出出现次数最多的数 通过遍历数组或列表,统计每个数出现的次数,并记录出现次数最多的数。 示例代码: int maxCount = …

    C# 2023年6月7日
    00
  • c#中object、var和dynamic的区别小结

    针对这个问题,我整理了一份详细讲解“C#中Object、var和dynamic的区别”的攻略,下面是详细讲解: Object、var和dynamic的区别小结 在C#编程中,object、var和dynamic是三个常用的类型。虽然它们都可以存储任意类型的数据,但它们的行为却截然不同。 1. Object Object是C#中所有类型的基类,也是一个基本的数…

    C# 2023年5月15日
    00
  • 详解asp.net core 依赖注入

    详解ASP.NET Core 依赖注入 ASP.NET Core 依赖注入是一种设计模式,它允许我们将对象的创建和管理从应用程序代码中分离出来。这种分离使得应用程序更加灵活、可测试和可维护。本攻略将详细介绍ASP.NET Core 依赖注入的概念、用法和示例。 什么是依赖注入? 依赖注入是一种设计模式,它允许我们将对象的创建和管理从应用程序代码中分离出来。在…

    C# 2023年5月16日
    00
  • 在Windows平台安装Jenkins

    在Windows平台安装Jenkins Jenkins 是一种流行的持续集成和持续交付工具,它可以帮助开发人员自动化构建、测试和部署应用程序。本攻略将介绍如何在 Windows 平台上安装 Jenkins。 安装步骤 以下是在 Windows 平台上安装 Jenkins 的步骤: 下载 Jenkins 安装程序。 可以从 Jenkins 的官方网站下载 Je…

    C# 2023年5月17日
    00
  • C#通过yield实现数组全排列的方法

    下面是关于“C#通过yield实现数组全排列的方法”的完整攻略,包含两个示例。 1. 什么是数组全排列 数组全排列是指将一个数组中的所有元素进行排列组合,得到所有可能的排列方式。例如,对于数组[1, 2, 3],它的全排列为[1, 2, 3]、[1, 3, 2]、[2, 1, 3]、[2, 3, 1]、[3, 1, 2]和[3, 2, 1]。 2. C#通过…

    C# 2023年5月15日
    00
  • C#基础语法:方法参数详解

    C#基础语法:方法参数详解 在 C# 中,方法的参数是指方法接收的数据类型和变量,它是方法的重要组成部分。方法参数允许我们向方法传递值,并在方法中使用这些值。本文将详细讲解 C# 中的方法参数及其使用方法。 方法参数的基本概念 示例方法定义如下所示: public int Add(int num1, int num2) { return num1 + num…

    C# 2023年5月15日
    00
  • Unity3D摄像机跟随小球移动而不旋转的设置方法

    让我们来讲解一下“Unity3D摄像机跟随小球移动而不旋转的设置方法”,以下是具体的步骤: 步骤一:创建一个场景 首先,在Unity编辑器中创建一个新场景,然后创建一个小球和一个摄像机。将小球放在场景中央,并将摄像机放在适当的位置来拍摄小球。 步骤二:设置摄像机位置和旋转 接下来,我们需要将摄像机的位置和旋转设置为固定的。具体步骤如下: 找到摄像机组件Ins…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部