当前位置: 首页 > 知识库问答 >
问题:

C#多部分表单数据httpclient上传csv服务

颜乐
2023-03-14

我有一个windows服务,正在上传一个多部分数据表单在C#。它上传了一个csv,其中包含身份验证变量,形式如下:一个密钥、一个上下文和一个UUID。变量是在自定义标记类中设置的。每次我尝试上传,我得到一个403错误。

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;
using System.Threading.Tasks;

namespace UploadScheduler.Service
{
    class UploadHttp
    {
        // HttpClient is instantiated once per application
        static readonly HttpClient client = new HttpClient();
        //myUserKey and myUuid are redacted values
        public static string userKey = "myUserKey";
        public static string uuid = "myUuid";

        public static void UploadFile(FileInfo file, Token token, DateTime lwt, DateTime nwt)
        {
            FileInfo fi = new FileInfo(file.FullName);
            string fileName = fi.Name;
            byte[] fileContents = File.ReadAllBytes(fi.FullName);
            Uri webService = new Uri(token.Url);
            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, webService);
            requestMessage.Headers.ExpectContinue = false;
            HttpWebRequest webRequest = WebRequest.CreateHttp(token.Url);
            webRequest.ServicePoint.Expect100Continue = false;
            MultipartFormDataContent multiPartContent = new MultipartFormDataContent();
            ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents);
            byteArrayContent.Headers.Add("Content-Type", "text/csv");
            multiPartContent.Add(byteArrayContent, "file", fileName);
            multiPartContent.Add(new StringContent(token.Key), "key");
            multiPartContent.Add(new StringContent(token.Context), "context");
            multiPartContent.Add(new StringContent(token.Uuid), "uuid");
            requestMessage.Content = multiPartContent;

            try
            {
                //Task<HttpResponseMessage> httpRequest = client.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
                Task<HttpResponseMessage> httpRequest = client.PostAsync(token.Url, multiPartContent, CancellationToken.None);
                HttpResponseMessage httpResponse = httpRequest.Result;
                HttpStatusCode statusCode = httpResponse.StatusCode;
                HttpContent responseContent = httpResponse.Content;

                if (responseContent != null)
                {
                    Task<String> stringContentsTask = responseContent.ReadAsStringAsync();
                    String stringContents = stringContentsTask.Result;
                    Library.RecordUpload(file, lwt, nwt);
                }
            }
            catch (Exception ex)
            {
                Library.WriteLog("Upload Error: " + file.Name + " " + ex.Message);
                //Library.WriteLog(ex.StackTrace);
            }
        }
    }
}

在我的开发过程中,我创建了自己的S3 bucket,并添加了能够成功上传文件的NuGet AWS S3类。现在我上传到第三方桶,我不断得到一个403错误。谢了!

共有1个答案

彭星津
2023-03-14

我使用Postman创建我的请求,然后用RestSharp NuGet包为C#生成代码。

public static void UploadFile(FileInfo file, Token token, DateTime lwt, DateTime nwt)
        {
            string status = "";
            string reason = "";
            try
            {
                var client = new RestClient(token.Url);
                client.Timeout = -1;
                var request = new RestRequest(Method.POST);
                request.AddParameter("key", token.Key);
                request.AddParameter("uuid", token.Uuid);
                request.AddParameter("context", token.Context);
                request.AddFile("file", file.FullName);
                IRestResponse response = client.Execute(request);
                status = response.StatusCode.ToString();
                reason = response.ErrorMessage.ToString();
                Library.RecordUploadSuccess(file, lwt, nwt);
            }
            catch (Exception ex)
            {
                Library.RecordUploadError(file, status, reason);
                //Library.RecordUploadError(file, ex.Message, ex.StackTrace);
            }
        }

强烈建议使用多部分表单数据

 类似资料:
  • 有人知道如何在中使用吗。Net 4.5与上传? 我在网上找不到任何例子。

  • 我正在尝试在 Java 应用程序中设置一个 Apache Camel 路由,其中使用者终结点是一个 restlet 组件,它将 HTTP 文件上传作为多部分表单数据的 POST 进行处理,然后创建者终结点将请求转发到也接受多部分表单数据的 rest 服务。我是骆驼的新手,不知道如何正确地连接它。以下是到目前为止我的路线。我是否需要对正文进行任何转换,还是会按原样转发多部分表单数据?有人可以为我提供

  • 我正在尝试使用Support Bee API创建附件,如下所述:https://supportbee.com/api#create_attachment 我编写了一个服务,它使用创建并发送使用文件名的请求。 如果我在《邮递员》中测试,它会成功。我正在为正文使用,只是从UI中选择要上载的文件: 当我试图通过我的服务上传它时,它不起作用: 这将导致500内部服务器错误。检查对象时,我可以看到它的标题值

  • 问题内容: 我对HttpClient非常满意,并且发现缺少(或公然不正确的)文档非常令人沮丧。我正在尝试使用Apache Http Client实现以下文章(在下面列出),但不知道如何实际执行。下周我将把自己埋在文档中,但是也许更有经验的HttpClient编码人员可以早日给我答案。 发布: 问题答案: 使用HttpMime库中的 MultipartEntityBuilder 来执行所需的请求。

  • 问题内容: 我是angular.js的初学者,但是对基础知识有很好的了解。 我要做的是上传文件和一些表单数据作为多部分表单数据。我读到这不是angular的功能,但是3rd party库可以做到这一点。我已经通过git克隆了angular-file-upload,但是仍然无法发布简单的表单和文件。 有人可以提供如何执行此操作的示例,html和js吗? 问题答案: 首先 您无需对结构进行任何特殊更改

  • 所以这个HTML代码以正确的格式提交数据给我。 谢了!