【问题标题】:HTTP POST file from .NET controller to java rest service从 .NET 控制器到 Java REST 服务的 HTTP POST 文件
【发布时间】:2018-06-26 18:09:42
【问题描述】:

最近我一直在尝试使用 HttpClient 通过 .net 控制器从 .net 控制器发布文件,

到 Java Rest 服务并失败了很多次,因为我无法以正确的格式发送文件。

下面的 ajax 调用以工作 jQuery 方式调用服务并使用元数据键传递文件。

function Upload() {
    var data = new FormData();
    data.append('file', document.getElementById("file").files[0])

    var metaData = [{"symbolicName": "DocumentTitle","dataType": "string","value": "Test CSEPF Document"}]
    data.append('metaData', JSON.stringify(metaData));

    $.ajax({
        url: 'http://xxx:xx/FileNetCoreRestServices/AddDocument',
        type: "POST",
        dataType: 'json',
        data: data,
        contentType: false,
        processData: false,
        success: function (data) {
            debugger
        }
    });
}

使用 ajax 发布时的请求负载

   ------WebKitFormBoundaryaCyKxSim0zzwhHK7
Content-Disposition: form-data; name="file"; filename="4.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryaCyKxSim0zzwhHK7
Content-Disposition: form-data; name="metaData"

[{"symbolicName":"DocumentTitle","dataType":"string","value":"Test CSEPF Document"}]
------WebKitFormBoundaryaCyKxSim0zzwhHK7--

现在我想在 .net 控制器端复制同样的东西, 根据我的研究,我知道我需要使用 MultipartFormDataContentHttpClient 才能使其正常工作。

以下是我为将文件上传到服务而编写的 .net 代码。

List<string> lstFilesToBeUploaded = null;
try
{
    string FileTransferApiUrl = "http://xxx:xx/FileNetCoreRestServices/AddDocument";

    lstFilesToBeUploaded = new List<string>();

    string OperatorSourceRootFolderPath = Server.MapPath(System.Configuration.ConfigurationSettings.AppSettings["UploadLocation"]);

    if (Directory.Exists(OperatorSourceRootFolderPath))
    {
        lstFilesToBeUploaded = Directory.GetFiles(OperatorSourceRootFolderPath).ToList();
    }

    foreach (string filePart in lstFilesToBeUploaded) // improvement - this is sequential, can be made threaded
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("metaData", "[{'symbolicName':'DocumentTitle','dataType':'string','value':'Test CSEPF Document'}]");

            using (var content = new MultipartFormDataContent())
            {
                byte[] Bytes = System.IO.File.ReadAllBytes(filePart);
                var fileContent = new StreamContent(new MemoryStream(Bytes));
                fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = Path.GetFileName(filePart) };
                content.Add(fileContent);

                var response = client.PostAsync(FileTransferApiUrl, fileContent).Result;
                if (response.IsSuccessStatusCode)
                {
                    var responseData = response.Content.ReadAsStringAsync().Result;
                }
            }
        }
    }
}
catch (Exception ex)
{
    throw ex;
}

当我运行此代码时,我得到的响应为

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Access-Control-Allow-Origin: * $WSEP: Transfer-Encoding: chunked Connection: Close Date: Wed, 27 Jun 2018 11:41:39 GMT Server: WebSphere Server: Application Server: Server/7.0 Content-Language: en-US Content-Type: text/html; charset=ISO-8859-1 }}

我不完全确定MultipartFormDataContent 是如何工作的,如果有人指出我哪里出错了会很有帮助。

【问题讨论】:

    标签: c# .net httpclient multipartform-data


    【解决方案1】:

    经过多次失败的尝试和研究,我能够使用该文件调用服务,以下是我用来实现此目的的工作代码。

     #region FILENET Upload
        string FileLocation = Server.MapPath(System.Configuration.ConfigurationSettings.AppSettings["FileLocation"]);
        var FileNetRestServiceURL = "http://xxx:xx/FileNetCoreRestServices/AddDocument";
    
    using (var client = new HttpClient())
    {
        using (var content = new MultipartFormDataContent())
        {
            //Working - Default Values
            //var values = new[]
            //{new KeyValuePair<string, string>("metaData", "[{'symbolicName':'DocumentTitle','dataType':'string','value':'Test CSEPF Document'}]")};
    
            //Real Values
            var values = new[]
            {new KeyValuePair<string, string>("metaData", "[{'symbolicName':'"+Path.GetFileNameWithoutExtension(FileLocation).ToString()+"','dataType':'string','value':'"+Path.GetFileNameWithoutExtension(FileLocation).ToString()+"'}]")};
    
            //Convert the file into ByteArrayContent as the service is expecting a file object
            content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(FileLocation)), "file", Path.GetFileName(FileLocation).ToString());
    
            foreach (var keyValuePair in values)
            {
                content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
            }
    
            var response = client.PostAsync(FileNetRestServiceURL, content).Result;
            if (response.IsSuccessStatusCode)
            {
                var responseData = response.Content.ReadAsStringAsync().Result;
            }
        }
    }
    #endregion
    

    【讨论】:

      【解决方案2】:

      尝试类似:

      using (var client = new HttpClient())
      {
          using (var content = new MultipartFormDataContent())
          {
              var values = new[]
              {
                  new KeyValuePair<string, string>("metaData", JsonConvert.SerializeObject("[{'symbolicName':'DocumentTitle','dataType':'string','value':'Test CSEPF Document'}]"))
              };
      
              foreach (var keyValuePair in values)
              {
                 content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
              }
      
          var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filePart));
          fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
          {
              FileName = "Foo.txt"
          };
          content.Add(fileContent);
      
          var requestUri = "http://xxxx:xxxx/CSEPFCoreRestServices/addDocument";
          var result = client.PostAsync(requestUri, content).Result;
      }
      

      }

      【讨论】:

      • 这是我收到的错误{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Access-Control-Allow-Origin: * $WSEP: Transfer-Encoding: chunked Connection: Close Date: Wed, 27 Jun 2018 11:41:39 GMT Server: WebSphere Server: Application Server: Server/7.0 Content-Language: en-US Content-Type: text/html; charset=ISO-8859-1 }}
      • 要按照您的工作请求的方式进行操作,您可能需要转换为 Json。您在工作请求中使用 Json.Stringify,但在 C# 请求中没有 Json 转换器。 JsonConvert.SerializeObject("[{'symbolicName':'DocumentTitle','dataType':'string','value':'Test CSEPF Document'}]");
      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      相关资源
      最近更新 更多