HTTP POST файл из контроллера .NET в службу отдыха Java - PullRequest
0 голосов
/ 26 июня 2018

В последнее время я пытался отправить файл из контроллера .net через контроллер .net с помощью HttpClient,

в службу отдыха Java и много раз не удавалось, так как я не смог отправить файл в правильном формате.

ниже вызова 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, Согласно моим исследованиям, я знаю, что мне нужно использовать MultipartFormDataContent и HttpClient, чтобы это работало.

ниже - код .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, было бы полезно, если кто-нибудь укажет, где я иду не так.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

После стольких неудачных попыток и исследований я смог вызвать службу с файлом, и ниже приведен рабочий код, который я использовал для достижения этой цели.

 #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
0 голосов
/ 26 июня 2018

попробуйте что-то вроде:

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;
}

}

...