首页 > 编程语言 >C#通过HttpWebRequest上传文件(自测通过)

C#通过HttpWebRequest上传文件(自测通过)

时间:2024-07-01 22:46:28浏览次数:1  
标签:string C# 自测 System HttpWebRequest var using boundary requestStream

C#通过HttpWebRequest进行文件上传,自己亲测没问题,如果需要请自取

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var url = "http://www.afosoallwx.cn/zhTestApi/public/admin.php/wechat/Afscdouniontransaction/Afsupload";
            var path = "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\景甜.jpg";
            FileUploader.UploadFile(url, path);

            Console.WriteLine("success");
            Console.ReadLine();
        }
    }

    public class FileUploader
    {
        public static void UploadFile(string url, string filePath, string fieldName = "file")
        {
            var fileInfo = new FileInfo(filePath);

            var request = (HttpWebRequest)WebRequest.Create(url);

            request.Method = "POST";

            // 设置ContentType为multipart/form-data,并包含一个随机生成的boundary  
            var boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
            request.ContentType = "multipart/form-data; boundary=" + boundary;

            // 这里简化了处理过程,通常你需要更详细地构建POST数据  
            // 包括文件和其他表单字段  

            // 假设你已经有了构建好的POST数据(bytes),以下是如何写入这些数据  
            using (var requestStream = request.GetRequestStream())
            {
                // 这里应该写入完整的multipart/form-data请求体  
                // 但为了简化,我们仅模拟写入一些数据  
                var buffer = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
                var header = $"Content-Disposition: form-data; name=\"{fieldName}\"; filename=\"{fileInfo.Name}\"\r\nContent-Type: {GetMimeType(fileInfo.Extension)}\r\n\r\n";
                var headerBytes = Encoding.UTF8.GetBytes(header);

                // 假设fileBytes是文件的字节数组  
                byte[] fileBytes = File.ReadAllBytes(filePath);

                // 写入boundary、header和文件内容  
                requestStream.Write(buffer, 0, buffer.Length);
                requestStream.Write(headerBytes, 0, headerBytes.Length);
                requestStream.Write(fileBytes, 0, fileBytes.Length);

                // 写入结尾boundary  
                var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                requestStream.Write(footer, 0, footer.Length);
            }

            // 发送请求并接收响应  
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                // 处理响应...  
                using (var resStream = response.GetResponseStream())
                {
                    using (StreamReader myStreamReader = new StreamReader(resStream, Encoding.UTF8))
                    {
                        string retString = myStreamReader.ReadToEnd();
                        Console.WriteLine(retString);
                    }
                }
            }

        }

        // 根据文件扩展名返回MIME类型,这里需要扩展以支持更多类型  
        private static string GetMimeType(string extension)
        {
            switch (extension.ToLower())
            {
                case ".jpg":
                case ".jpeg":
                    return "image/jpeg";
                case ".png":
                    return "image/png";
                // 添加更多case来处理其他文件类型  
                default:
                    return "application/octet-stream";
            }
        }
    }

}

 

标签:string,C#,自测,System,HttpWebRequest,var,using,boundary,requestStream
From: https://www.cnblogs.com/duanjt/p/18278975

相关文章

  • 9、 Django-重定向-Redirect
    导入模块fromdjango.shortcutsimportredirect,reverse 概念:在视图函数中做跳转到其它页面 如:1、views.py---------------------------------------------------------------------------------fromdjango.shortcutsimportrenderfromApp_route.modelsimport*......
  • ts vue3 getCurrentInstance 使用,$refs 调用方式
    代码示例可以通过ref变量实现绑定$ref,或者getCurrentInstance来获取$refs/***$ref使用方式,变量名和组件的属性ref值一致*/consthChildRef=ref()console.log(hChildRef,"hChildRef")constinstance=getCurrentInstance()//constself=(instanceasComponen......
  • tc 动态控制带宽
    在模拟网络情况的时候不可避免的会要模拟动态网络变化,常用的有mahimahi和tc,mahimahi自己设置trace文件,每一行内容为这一毫秒发送了多少数据即可动态控制,而tc一般利用命令行控制,所以需要一点shell脚本基础。首先是shell的数组建立:band(010203020100)shell中数组利用space......
  • 基于dspic33ck64mp105的电机控制器开发①
    原理图是基于microchip官方的MCP1722_Power_Tools参考设计而来,修改部分如下:https://www.microchip.com/en-us/tools-resources/reference-designs/portable-power-tool-reference-design1,修改了电源模块2,修改了栅极驱动3,增加了蓝牙通信模块4,修改了原版AUX的端口5,增加了一个LED......
  • [论文阅读] Calligraphy Font Generation via Explicitly Modeling Location-Aware Gl
    Pretitle:CalligraphyFontGenerationviaExplicitlyModelingLocation-AwareGlyphComponentDeformationssource:TMM2023paper:https://ieeexplore.ieee.org/document/10356848code:None关键词:generativeadversarialnetworks,imageprocessing,imagesynth......
  • A. And Matching
    链接:https://codeforces.com/problemset/problem/1630/A题目:思路:1.首先k=0时很显然所有的pair为:{i,n-i}2.k<n-1时所有的pair为{0,n-k-1},{k,n-1},{i,n-i}可以结合位运算的性质来看3.k=n-1的时候,当n=4或2时显然没有。当n>4时可以如下分析:首先需要合成的是11111(举例)考虑如下......
  • C++中的引用(Reference)
    1.引用(Reference)在C++中,引用(Reference)是一个变量的别名.它允许你通过不同的名字访问同一个变量.与指针不同,引用在定义时必须被初始化,并且一旦绑定到某个变量,之后不能更改引用的绑定对象.引用的语法引用(Reference)是C++中的一种重要特性,提供了对现有变量的另一种名称或别......
  • 3、爬虫-selenium-获取用户cookie的使用
    注意这里使用的是chrom浏览器、所以要下载对应版本的chromdriver.exe工具、且放在同一文件目录下或者在电脑中设置环境变量、或者放在pycharm安装目录下的 E:\installDir\python\Scripts 路径下即可chromedriver-120.exefromseleniumimportwebdriver#webdriver.Chrom......
  • 4、爬虫-数据获取之双R(CS/BS)与chrom检查工具使用-requests请求
    模拟客户端请求服务端:  ·模拟请求行和请求头、请求体 """模拟客户端请求获取静态数据和动态数据使用python自己去构造请求使用request""""""请求的构成:请求行、请求头、请求体"""###########################静态页面加载请求的##############################......
  • C语言复习
    C语言必问(待更新)1、变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。2、C语言中,变量的作用域在C语言中,......