কেউ কীভাবে জানে। আপলোড HttpClient
সহ নেট 4.5 ব্যবহার করতে হয় multipart/form-data
?
আমি ইন্টারনেটে কোনও উদাহরণ খুঁজে পাইনি।
কেউ কীভাবে জানে। আপলোড HttpClient
সহ নেট 4.5 ব্যবহার করতে হয় multipart/form-data
?
আমি ইন্টারনেটে কোনও উদাহরণ খুঁজে পাইনি।
উত্তর:
আমার ফলাফলটি এরকম দেখাচ্ছে:
public static async Task<string> Upload(byte[] image)
{
using (var client = new HttpClient())
{
using (var content =
new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture)))
{
content.Add(new StreamContent(new MemoryStream(image)), "bilddatei", "upload.jpg");
using (
var message =
await client.PostAsync("http://www.directupload.net/index.php?mode=upload", content))
{
var input = await message.Content.ReadAsStringAsync();
return !string.IsNullOrWhiteSpace(input) ? Regex.Match(input, @"http://\w*\.directupload\.net/images/\d*/\w*\.[a-z]{3}").Value : null;
}
}
}
}
new MultipartFormDataContent(...)
একটি অবৈধ সীমানা চরিত্র (সম্ভবত "/" বিভাজক) রয়েছে। কোনও ত্রুটি নেই, সার্ভারে কেবল কোনও ফাইল পোস্ট করা হয়নি - আমার ক্ষেত্রে, Context.Request.Files.Count = 0 এপিআই নিয়ন্ত্রণকারীতে। সম্ভবত কেবল একটি Nancy
সমস্যা, তবে আমি DateTime.Now.Ticks.ToString("x")
পরিবর্তে এর মতো কিছু ব্যবহার করার পরামর্শ দিচ্ছি ।
key
এবং এই fileName
পরামিতিগুলিকে content
( উদাহরণস্বরূপ বিল্ডডেটি এবং আপলোড.জেপজি ) যুক্ত করার চেষ্টা করুন ।
এটি কমবেশি এর মতো কাজ করে (উদাহরণস্বরূপ কোনও চিত্র / জেপিজি ফাইল ব্যবহার করে):
async public Task<HttpResponseMessage> UploadImage(string url, byte[] ImageData)
{
var requestContent = new MultipartFormDataContent();
// here you can specify boundary if you need---^
var imageContent = new ByteArrayContent(ImageData);
imageContent.Headers.ContentType =
MediaTypeHeaderValue.Parse("image/jpeg");
requestContent.Add(imageContent, "image", "image.jpg");
return await client.PostAsync(url, requestContent);
}
(আপনি requestContent.Add()
যা খুশি তাই করতে পারেন, এইচটিটিপি কনটেন্ট বংশধরকে একবার দেখুন করার জন্য উপলব্ধ প্রকারগুলি দেখতে )
সম্পূর্ণ হয়ে গেলে, আপনি HttpResponseMessage.Content
ভোজন করতে পারেন এমন প্রতিক্রিয়া সামগ্রীটি ভিতরে খুঁজে পাবেন HttpContent.ReadAs*Async
।
// here you can specify boundary if you need---^
async
প্রথম লাইনে এবং await
লাইনের আগে শেষের আগে অপ্রয়োজনীয়।
মাল্টিপার্টফর্মডাটা কনটেন্ট ব্যবহার করে এইচটিটিপিপ্লায়েন্টের সাথে স্ট্রিং এবং ফাইল স্ট্রিম পোস্ট করার জন্য এটি উদাহরণ। প্রতিটি HTTP কনটেন্টের জন্য সামগ্রী-বিশৃঙ্খলা এবং বিষয়বস্তুর ধরণ নির্দিষ্ট করা দরকার:
এখানে আমার উদাহরণ। আশা করি এটা সাহায্য করবে:
private static void Upload()
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("User-Agent", "CBS Brightcove API Service");
using (var content = new MultipartFormDataContent())
{
var path = @"C:\B2BAssetRoot\files\596086\596086.1.mp4";
string assetName = Path.GetFileName(path);
var request = new HTTPBrightCoveRequest()
{
Method = "create_video",
Parameters = new Params()
{
CreateMultipleRenditions = "true",
EncodeTo = EncodeTo.Mp4.ToString().ToUpper(),
Token = "x8sLalfXacgn-4CzhTBm7uaCxVAPjvKqTf1oXpwLVYYoCkejZUsYtg..",
Video = new Video()
{
Name = assetName,
ReferenceId = Guid.NewGuid().ToString(),
ShortDescription = assetName
}
}
};
//Content-Disposition: form-data; name="json"
var stringContent = new StringContent(JsonConvert.SerializeObject(request));
stringContent.Headers.Add("Content-Disposition", "form-data; name=\"json\"");
content.Add(stringContent, "json");
FileStream fs = File.OpenRead(path);
var streamContent = new StreamContent(fs);
streamContent.Headers.Add("Content-Type", "application/octet-stream");
//Content-Disposition: form-data; name="file"; filename="C:\B2BAssetRoot\files\596090\596090.1.mp4";
streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(path) + "\"");
content.Add(streamContent, "file", Path.GetFileName(path));
//content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
Task<HttpResponseMessage> message = client.PostAsync("http://api.brightcove.com/services/post", content);
var input = message.Result.Content.ReadAsStringAsync();
Console.WriteLine(input.Result);
Console.Read();
}
}
}
MultipartFormDataContent
। আপনাকে স্যার
Content-Type
এবং Content-Disposition
ঠিক আছে, তবে সার্ভার ২০০৮ আর 2 (আইআইএস 7.5) এ ফাইলগুলি খুঁজে পাওয়া যায় না, এটি আশ্চর্যের বিষয়। সুতরাং আমি উত্তর হিসাবে না।
কীভাবে HttpClient
আপলোড করতে হয় তার আরেকটি উদাহরণ এখানে multipart/form-data
।
এটি একটি ফাইলকে একটি আরএসটি এপিআইতে আপলোড করে এবং ফাইলটি নিজেই (যেমন একটি জেপিজি) এবং অতিরিক্ত এপিআই প্যারামিটার অন্তর্ভুক্ত করে। ফাইলটি স্থানীয় ডিস্ক থেকে সরাসরি আপলোড করা হয় FileStream
।
অতিরিক্ত এপিআই নির্দিষ্ট যুক্তি সহ পুরো উদাহরণের জন্য এখানে দেখুন ।
public static async Task UploadFileAsync(string token, string path, string channels)
{
// we need to send a request with multipart/form-data
var multiForm = new MultipartFormDataContent();
// add API method parameters
multiForm.Add(new StringContent(token), "token");
multiForm.Add(new StringContent(channels), "channels");
// add file and directly upload it
FileStream fs = File.OpenRead(path);
multiForm.Add(new StreamContent(fs), "file", Path.GetFileName(path));
// send request to API
var url = "https://slack.com/api/files.upload";
var response = await client.PostAsync(url, multiForm);
}
এটি আমার জন্য এটি কাজ করে দেখুন।
private static async Task<object> Upload(string actionUrl)
{
Image newImage = Image.FromFile(@"Absolute Path of image");
ImageConverter _imageConverter = new ImageConverter();
byte[] paramFileStream= (byte[])_imageConverter.ConvertTo(newImage, typeof(byte[]));
var formContent = new MultipartFormDataContent
{
// Send form text values here
{new StringContent("value1"),"key1"},
{new StringContent("value2"),"key2" },
// Send Image Here
{new StreamContent(new MemoryStream(paramFileStream)),"imagekey","filename.jpg"}
};
var myHttpClient = new HttpClient();
var response = await myHttpClient.PostAsync(actionUrl.ToString(), formContent);
string stringContent = await response.Content.ReadAsStringAsync();
return response;
}
TestServer.CreatClient()
একটি ডেটা + ফাইল আপলোডের জন্য ইন্টিগ্রেশন পরীক্ষার .NET মূল দৃশ্যে আমি ঠিক কীটি সন্ধান করছিলাম ।
আমার জন্য কাজ করে এমন একটি সম্পূর্ণ নমুনা এখানে। boundary
অনুরোধে মান .NET দ্বারা স্বয়ংক্রিয়ভাবে যোগ করা হয়।
var url = "http://localhost/api/v1/yourendpointhere";
var filePath = @"C:\path\to\image.jpg";
HttpClient httpClient = new HttpClient();
MultipartFormDataContent form = new MultipartFormDataContent();
FileStream fs = File.OpenRead(filePath);
var streamContent = new StreamContent(fs);
var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
form.Add(imageContent, "image", Path.GetFileName(filePath));
var response = httpClient.PostAsync(url, form).Result;
প্রিলোডার ডটনেট 3.0 কোর সহ উদাহরণ with
ProgressMessageHandler processMessageHander = new ProgressMessageHandler();
processMessageHander.HttpSendProgress += (s, e) =>
{
if (e.ProgressPercentage > 0)
{
ProgressPercentage = e.ProgressPercentage;
TotalBytes = e.TotalBytes;
progressAction?.Invoke(progressFile);
}
};
using (var client = HttpClientFactory.Create(processMessageHander))
{
var uri = new Uri(transfer.BackEndUrl);
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", AccessToken);
using (MultipartFormDataContent multiForm = new MultipartFormDataContent())
{
multiForm.Add(new StringContent(FileId), "FileId");
multiForm.Add(new StringContent(FileName), "FileName");
string hash = "";
using (MD5 md5Hash = MD5.Create())
{
var sb = new StringBuilder();
foreach (var data in md5Hash.ComputeHash(File.ReadAllBytes(FullName)))
{
sb.Append(data.ToString("x2"));
}
hash = result.ToString();
}
multiForm.Add(new StringContent(hash), "Hash");
using (FileStream fs = File.OpenRead(FullName))
{
multiForm.Add(new StreamContent(fs), "file", Path.GetFileName(FullName));
var response = await client.PostAsync(uri, multiForm);
progressFile.Message = response.ToString();
if (response.IsSuccessStatusCode) {
progressAction?.Invoke(progressFile);
} else {
progressErrorAction?.Invoke(progressFile);
}
response.EnsureSuccessStatusCode();
}
}
}
X509Certificate clientKey1 = null;
clientKey1 = new X509Certificate(AppSetting["certificatePath"],
AppSetting["pswd"]);
string url = "https://EndPointAddress";
FileStream fs = File.OpenRead(FilePath);
var streamContent = new StreamContent(fs);
var FileContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
FileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("ContentType");
var handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(clientKey1);
handler.ServerCertificateValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) =>
{
return true;
};
using (var client = new HttpClient(handler))
{
// Post it
HttpResponseMessage httpResponseMessage = client.PostAsync(url, FileContent).Result;
if (!httpResponseMessage.IsSuccessStatusCode)
{
string ss = httpResponseMessage.StatusCode.ToString();
}
}
আমি একটি কোড স্নিপেট যুক্ত করছি যা একটি এপিআইতে কীভাবে কোনও ফাইল পোস্ট করতে পারে যা ডিলেট ডিএনপিটি ক্রিয়া দ্বারা প্রকাশিত হয়েছে shows ডিলিট HTTP ক্রিয়া সহ কোনও ফাইল আপলোড করা এটি সাধারণ ঘটনা নয় তবে এটি অনুমোদিত। আমি কলটি অনুমোদনের জন্য উইন্ডোজ এনটিএলএম প্রমাণীকরণ গ্রহণ করেছি।
সমস্যা এক শক্তি মুখ যে সব overloads যে HttpClient.DeleteAsync
পদ্ধতির জন্য কোন প্যারামিটার আছে HttpContent
উপায় আমরা এটা পাবেন PostAsync
পদ্ধতি
var requestUri = new Uri("http://UrlOfTheApi");
using (var streamToPost = new MemoryStream("C:\temp.txt"))
using (var fileStreamContent = new StreamContent(streamToPost))
using (var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true })
using (var httpClient = new HttpClient(httpClientHandler, true))
using (var requestMessage = new HttpRequestMessage(HttpMethod.Delete, requestUri))
using (var formDataContent = new MultipartFormDataContent())
{
formDataContent.Add(fileStreamContent, "myFile", "temp.txt");
requestMessage.Content = formDataContent;
var response = httpClient.SendAsync(requestMessage).GetAwaiter().GetResult();
if (response.IsSuccessStatusCode)
{
// File upload was successfull
}
else
{
var erroResult = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
throw new Exception("Error on the server : " + erroResult);
}
}
আপনার সি # ফাইলের শীর্ষে আপনার নেমস্পেসের নীচে প্রয়োজন:
using System;
using System.Net;
using System.IO;
using System.Net.Http;
আমার কোডে অনেকগুলি ব্লক (আইডিস্পোজেবল প্যাটার্ন) ব্যবহার করে পিএস দুঃখিত। দুর্ভাগ্যক্রমে, সি # এর কনস্ট্রাক্ট ব্যবহারের বাক্য গঠনটি একক বিবৃতিতে একাধিক ভেরিয়েবল আরম্ভ করার পক্ষে সমর্থন করে না।
public async Task<object> PassImageWithText(IFormFile files)
{
byte[] data;
string result = "";
ByteArrayContent bytes;
MultipartFormDataContent multiForm = new MultipartFormDataContent();
try
{
using (var client = new HttpClient())
{
using (var br = new BinaryReader(files.OpenReadStream()))
{
data = br.ReadBytes((int)files.OpenReadStream().Length);
}
bytes = new ByteArrayContent(data);
multiForm.Add(bytes, "files", files.FileName);
multiForm.Add(new StringContent("value1"), "key1");
multiForm.Add(new StringContent("value2"), "key2");
var res = await client.PostAsync(_MEDIA_ADD_IMG_URL, multiForm);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return result;
}