首页 > 编程语言 >C# Body为form-data file文件上传至第三方接口

C# Body为form-data file文件上传至第三方接口

时间:2024-05-20 14:53:12浏览次数:27  
标签:Body 文件 form Show C# System originalName var using

1.首先,让我们看一下第三方API接口在Postman工具中的展示:

  • 请求方式:POST
  • 请求URL:http://192.168.100.246:30011/sino-qc/product/inspect/ocr-name
  • 请求Header:Content-Type: multipart/form-data
  • 请求Body:file(类型为file)

 

2.现在,让我们编写C#代码来实现文件上传功能。我们可以使用 HttpClient 类来发送HTTP请求,并通过 MultipartFormDataContent 类来构建上传文件的form-data格式。以下是完整的C#代码示例: 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SinocareFileUploadWinForms.Utillity;

namespace SinocareFileUploadWinForms
{
    public partial class MainForm : Form
    {
        private const string ApiUrl = "http://192.168.100.246:31861/product/inspect/ocr-name";
        //private string ApiUrl = Utillity.HttpRequestHelper.GetSinocareFileUploadUrl();
        public MainForm()
        {
            InitializeComponent();
        }
        private async void UploadButton_Click(object sender, EventArgs e)
        {
            #region MyRegion
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = true; // 允许多选文件
            dialog.Filter = "PDF Files (*.pdf)|*.pdf|All Files (*.*)|*.*";
            dialog.Title = "Select PDF Files";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var httpClient = new HttpClient();
                var content = new MultipartFormDataContent();
                content.Headers.ContentType.CharSet = "utf-8"; //设置字符集
                foreach (var filePath in dialog.FileNames)
                {

                    var fileStream = new FileStream(filePath, FileMode.Open);
                    var fileContent = new StreamContent(fileStream);
                    content.Add(fileContent, "files", Path.GetFileName(filePath));
                }
                try
                {
                    var response = httpClient.PostAsync(ApiUrl, content);
                    response.Wait();//等待请求结果
                    if (response.Result.IsSuccessStatusCode)
                    {
                        var jsonString = response.Result.Content.ReadAsStringAsync().Result;
                        var jsonData = JObject.Parse(jsonString);
                        var renameInstructions = jsonData["data"] as JArray;
                        if (renameInstructions != null)
                        {
                            foreach (var item in renameInstructions)
                            {
                                var originalName = item["orginName"].ToString();
                                var newName = item["newName"].ToString();
                                var originalPath = dialog.FileNames.FirstOrDefault(path => Path.GetFileName(path) == originalName);
                                if (originalPath != null)
                                {
                                    var directoryPath = Path.GetDirectoryName(originalPath);
                                    var newPath = Path.Combine(directoryPath, newName);
                                    try
                                    {
                                        File.Move(originalPath, newPath); // 尝试重命名文件
                                        MessageBox.Show($"文件重命名成功: {originalName} -> {newName}");
                                    }
                                    catch (IOException ioe)
                                    {
                                        MessageBox.Show($"重命名文件时发生错误: {ioe.Message},文件: {originalName}");
                                    }
                                    catch (UnauthorizedAccessException uae)
                                    {
                                        MessageBox.Show($"没有权限重命名文件: {uae.Message},文件: {originalName}");
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show($"未知错误在重命名文件时发生: {ex.Message},文件: {originalName}");
                                    }
                                }
                                else
                                {
                                    Console.WriteLine($"找不到原始文件: {originalName}");
                                }
                           
                                //Console.WriteLine($"原文件名: {originalName}, 新文件名: {newName}");
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show($"上传失败,错误码: {(int)response.Result.StatusCode}");
                    }
                }
                catch (AggregateException ae)
                {
                    foreach (var innerEx in ae.InnerExceptions)
                    {
                        MessageBox.Show($"发生错误: {innerEx.Message}");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"发生错误: {ex.Message}");
                }


            }
            #endregion

      }
    }
}

我们首先指定第三方API的URL和选择要上传的文件路径。然后,我们创建一个 HttpClient 实例,并构建一个 MultipartFormDataContent 对象,将文件内容添加到form-data中。最后,我们发送POST请求并检查响应状态码以确保文件上传成功。

刚刚开始请求的时候一直收不到第三方API接口的响应,可以检查网关的配置文件或者管理界面,确认相关配置是否正确   https://blog.csdn.net/m0_45067620/article/details/136141032

标签:Body,文件,form,Show,C#,System,originalName,var,using
From: https://www.cnblogs.com/zengzhanping/p/18201829

相关文章

  • .NetCore工具
    1、更新GeneralUpdate:Myshiplooksold,whocanhelpmeupgradeit.(gitee.com)GeneralUpdate是一款基于.NETStandard2.0开源自动升级组件。运行环境:.NET7、.NETMAUI、Visualstudio2022(Preview)功能是否支持备注断点续传支持单次更新失败时,下次一次启动时......
  • oracle sqlplus
    在逻辑结构中,Oracle从大到下,分别是如下的结构:数据库实例->表空间->数据段(表)->区->块。也就是说当我们要使用Oracle作为项目的数据库时,我们需要先创建数据库实例,之后创建表空间,再创建相对应的表(也就是逻辑结构中的数据段)。一、创建数据库实例创建数据库实例一般使用“配......
  • 【Nginx】开启SSI模块支持include文件引入
    SSI是ServerSideInclude的首字母缩略词。包含有嵌入式服务器方包含命令的HTML文本。在被传送给浏览器之前,服务器会对SHTML文档进行完全地读取、分析以及修改。在Nginx中,开启SSI支持非常简单,通过向nginx.conf中添加几行设置命令即可实现。将下面的3行代码添加到ngi......
  • VMware ESXi 6.7U3u macOS Unlocker & OEM BIOS 标准版和厂商定制版 UI fix
    VMwareESXi6.7U3umacOSUnlocker&OEMBIOS标准版和厂商定制版UIfixESXi6.7U3u标准版,Dell(戴尔)、HPE(慧与)OEM定制版请访问原文链接:https://sysin.org/blog/vmware-esxi-6-oem/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org除了需要兼容RTL网卡有......
  • VMware ESXi 6.7U3u macOS Unlocker & OEM BIOS 集成 Realtek 网卡驱动和 NVMe 驱动 (
    VMwareESXi6.7U3umacOSUnlocker&OEMBIOS集成Realtek网卡驱动和NVMe驱动(集成驱动版)UIfix此版本解决的问题:VMwareHostClient无法将现有虚拟磁盘(VMDK)附加到虚拟机请访问原文链接:https://sysin.org/blog/vmware-esxi-6-sysin/,查看最新版。原创作品,转载请保......
  • EasyUEFI、Bootice、Bcdedit和EfiVarCLI都是用于管理计算机启动项和UEFI设置的工具,但
    EasyUEFI、Bootice、Bcdedit和EfiVarCLI都是用于管理计算机启动项和UEFI设置的工具,但它们在功能和用途上有一些区别:EasyUEFI:EasyUEFI是一个用户友好的图形界面工具,主要用于管理UEFI引导项,在Windows操作系统下操作更加方便。EasyUEFI提供了添加、删除、编辑UEFI引导项的......
  • fullcalendar-vue3插件实现时间资源图
    用的vue3+最新版本:官网链接:https://fullcalendar.io/demos效果如图:x轴为人员,y轴为当日的时间段:  1.安装引入npminstall--save@fullcalendar/core@fullcalendar/resource@fullcalendar/resource-timegrid package.json 2.附上代码<script>import{defin......
  • 博客更换新域名为52ecy.cn
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`博客更换新域名为52ecy.cn日期:2017-10-20阿珏谈天说地浏览:2077次评论:0条博客又更换新域名了,咦,我为什么要说又好吧好吧,建站才一......
  • C++ 异常处理注意事项总结
    C++异常处理注意事项总结:异常安全代码:编写异常安全的代码是至关重要的。这意味着你的代码应该在面对异常时能够正确地清理资源并维持程序状态。使用RAII(ResourceAcquisitionIsInitialization)技术可以帮助自动管理资源,减少内存泄漏的风险。使用noexcept:对于不会抛出异常......
  • C++ 多线程编程要点总结
    C++多线程编程要点总结:选择合适的线程库:C++11引入了 <thread> 头文件,提供了对线程的原生支持。也可以使用第三方库,如Boost.Thread,它提供了更多高级功能和更好的跨平台兼容性。线程创建与管理:使用 std::thread 类创建新线程,并传入函数或可调用对象作为线程的入口......