最近我一直在尝试使用HttpClient通过.net控制器从.net控制器发布文件
到Java Rest Service并失败了很多次,因为我无法以正确的格式发送文件。
以有效的jQuery方式在ajax调用下调用服务,并使用元数据密钥传递文件。
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
的工作方式,如果有人指出我要去哪里,这会很有帮助。
答案 0 :(得分:0)
尝试类似的东西:
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;
}
}
答案 1 :(得分:0)
经过多次失败的尝试和研究,我能够使用该文件调用该服务,以下是我用来实现此目的的工作代码。
#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