ไม่มีใครรู้วิธีใช้HttpClient
in .Net 4.5 พร้อมmultipart/form-data
อัปโหลดไหม
ฉันไม่พบตัวอย่างใด ๆ บนอินเทอร์เน็ต
ไม่มีใครรู้วิธีใช้HttpClient
in .Net 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 ในตัวควบคุม API อาจเป็นเพียงNancy
ปัญหา แต่ฉันแนะนำให้ใช้บางสิ่งบางอย่างDateTime.Now.Ticks.ToString("x")
แทน
key
และfileName
พารามิเตอร์ไปที่content
( bilddateiและupload.jpgในตัวอย่างนี้)
มันทำงานได้มากกว่าหรือน้อยกว่าเช่นนี้ (ตัวอย่างเช่นการใช้ไฟล์รูปภาพ / jpg):
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()
สิ่งที่คุณต้องการดูที่ลูกหลาน HttpContentเพื่อดูประเภทที่มีให้ผ่าน)
เมื่อเสร็จแล้วคุณจะพบเนื้อหาการตอบสนองภายในHttpResponseMessage.Content
ที่คุณสามารถบริโภคHttpContent.ReadAs*Async
ได้
// here you can specify boundary if you need---^
:)
async
ในบรรทัดแรกและawait
บนบรรทัดก่อนหน้าสุดท้ายไม่จำเป็น
นี่เป็นตัวอย่างของวิธีการโพสต์สตริงและสตรีมไฟล์ด้วย HTTPClient โดยใช้ MultipartFormDataContent จำเป็นต้องระบุ Content-Disposition และ Content-Type สำหรับแต่ละ HTTPContent:
นี่คือตัวอย่างของฉัน หวังว่าจะช่วย:
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
ก็โอเค แต่ใน Server 2008 R2 (IIS 7.5) ไม่สามารถค้นหาไฟล์มันแปลก ดังนั้นฉันทำตามคำตอบ
นี่เป็นอีกตัวอย่างหนึ่งเกี่ยวกับวิธีการใช้ที่จะอัปโหลดHttpClient
multipart/form-data
มันอัปโหลดไฟล์ไปยัง REST API และรวมถึงไฟล์เอง (เช่น JPG) และพารามิเตอร์ API เพิ่มเติม FileStream
ไฟล์จะถูกอัปโหลดโดยตรงจากดิสก์ท้องถิ่นผ่าน
ดูที่นี่สำหรับตัวอย่างแบบเต็มรวมถึงตรรกะเฉพาะ API เพิ่มเติม
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 Core ของการทดสอบการรวมสำหรับการอัปโหลดข้อมูล + ไฟล์
นี่คือตัวอย่างที่สมบูรณ์ที่ใช้งานได้สำหรับฉัน 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;
ตัวอย่างกับ preloader Dotnet 3.0 Core
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();
}
}
ฉันกำลังเพิ่มข้อมูลโค้ดซึ่งแสดงวิธีโพสต์ไฟล์ไปยัง API ซึ่งเปิดเผยผ่าน DELETE http verb นี่ไม่ใช่กรณีทั่วไปในการอัปโหลดไฟล์ที่มี DELETE http verb แต่อนุญาตให้ทำได้ ฉันถือว่า Windows NTLM รับรองความถูกต้องสำหรับการอนุญาตการโทร
ปัญหาที่หนึ่งอาจเผชิญคือ 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);
}
}
คุณต้องการ namespaces ด้านล่างที่ด้านบนของไฟล์ C # ของคุณ:
using System;
using System.Net;
using System.IO;
using System.Net.Http;
ป.ล. ขออภัยเกี่ยวกับบล็อกจำนวนมาก (รูปแบบ IDisposable) ในรหัสของฉัน ขออภัยไวยากรณ์ของการใช้โครงสร้างของ C # ไม่สนับสนุนการเริ่มต้นตัวแปรหลายตัวในคำสั่งเดียว
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;
}