【问题标题】:Sending a file with RestClient request使用 RestClient 请求发送文件
【发布时间】:2020-05-07 15:00:54
【问题描述】:

我在 .Net Core 中有一项服务,它以 IFormFile 作为参数。我想将此 IFormFile 中的数据发送到 Api。下面的代码是邮递员自动生成的代码,适用于我的请求。在'attachmentRequest.AddFile("file", file);'行,文件是邮递员上传文件的本地路径的字符串。将我的 IFormfile 作为文件发送的最佳方式是什么?我是否使用流并将 IFormfile 保存到 .Net Core 中的某个位置并传递该地址?

          public async Task<bool> PostIssue(IFormFile file)
            {
            var client = new RestClient("https://sample/10000/attachments");
            client.Timeout = -1;
            var attachmentRequest = new RestRequest(Method.POST);
            attachmentRequest.AddHeader("X-Atlassian-Token", "no-check");
            attachmentRequest.AddHeader("Authorization", "Basic xxxxxxxxxxxxxx=");
            attachmentRequest.AddHeader("Cookie", "atlassian.xsrf.token=xxxxxxxxxxxxxxxxxx_lin");
            attachmentRequest.AddFile("file", file);
            IRestResponse attachmentResponse = client.Execute(attachmentRequest);
            Console.WriteLine(attachmentResponse.Content);

            if (attachmentResponse.IsSuccessful)
            {
                return true;
            }
            else
            {
                return false;
           }
         }

【问题讨论】:

    标签: c# asp.net-core stream postman


    【解决方案1】:

    你使用AddFile的第二种方法:

      public IRestRequest AddFile (string name, byte [] bytes, string fileName, string contentType = null);
    

    将 IFormFile 文件转换为byte array 格式,而不是获取传输文件的路径。

    你说的使用stream上传到本地确实是可以的,但这是一个额外的动作,你可以直接将IFormFile操作成字节形式传给API,如下图:

     public async Task<bool> PostIssue(IFormFile file)
            {
                var client = new RestClient("http://localhost:50855/Users");
                client.Timeout = -1;
                var attachmentRequest = new RestRequest(Method.POST);
                attachmentRequest.AddHeader("X-Atlassian-Token", "no-check");
                attachmentRequest.AddHeader("Authorization", "Basic xxxxxxxxxxxxxx=");
                attachmentRequest.AddHeader("Cookie", "atlassian.xsrf.token=xxxxxxxxxxxxxxxxxx_lin");
    
                using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    var fileBytes = ms.ToArray();
                    attachmentRequest.AddFile("filename",fileBytes, file.FileName);
                }
                IRestResponse attachmentResponse = client.Execute(attachmentRequest);
                Console.WriteLine(attachmentResponse.Content);
                if (attachmentResponse.IsSuccessful)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    

    API:

    public async Task<IActionResult> attachments()
            {
                var file = Request.Form.Files["filename"]; //get the file
                //do something you want
                return Ok();
            }
    

    这是测试结果:

    【讨论】:

    • 非常明确的答案,我没有意识到 .AddFile() 有一个重载,它采用字节数组而不是 URL。谢谢!
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多