У меня есть требование отправить двоичный файл размером 100 МБ данных в формате JSON или байтового массива в Web API 1.1. Мое клиентское приложение - это приложение winforms на C# с 32-битной архитектурой. Где я хочу выполнить чтение двоичного файла из этого клиентского приложения и отправить этот массив байтов двоичного файла в веб-API.
Текущая реализация в моем приложении winforms приведена ниже.
var sFile = @"C"\binary.zip";
var mybytearray = File.ReadAllBytes(sFile);
var webRequest =
(HttpWebRequest)WebRequest.Create("http://localhost/filewriter");
webRequest.ContentType = "text/plain";
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.AllowWriteStreamBuffering = true;
webRequest.Timeout = 100000;
webRequest.Headers.Add("fileName", Path.GetFileName(sFile));
webRequest.ContentLength = mybytearray.Length;
using (var dataStream = new StreamWriter(webRequest.GetRequestStream()))
dataStream.Write(mybytearray);
using (var response = webRequest.GetResponse())
{
if (response.StatusCode = HttpStatusCode.Ok;
return true;
}
ниже написано в моем методе веб-API
[HttpPost]
public HttpResponseMessage filewriter(byte[] binaryData)
{
using (FileStream binaryFileStream = new FileStream("C:\\myNewFile.zip", FileMode.Create, FileAccess.ReadWrite))
{
binaryFileStream.Write(binaryData, 0, binaryData.Length);
}
}
Как вы можете видеть, в приведенном выше коде мне не удалось отправить байтовый массив в файловый редактор метода веб-API. Мне не хватает чего-то, что должно работать в этом случае.
Другим способом, как я уже сказал, я пробовал то же самое, но вместо массива байтов с Json, как показано ниже
var sFile = @"C"\binary.zip";
var mybytearray = File.ReadAllBytes(sFile);
var mymodel = new model
{
fileName = sFile,
binaryData = mybytearray
};
var jsonResendObjects = JsonConvert.SerializeObject(mymodel);
var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost/filewriter");
webRequest.ContentType = "application/json";
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.AllowWriteStreamBuffering = true;
webRequest.Timeout = 100000;
webRequest.Headers.Add("fileName", Path.GetFileName(sFile));
webRequest.ContentLength = jsonResendObjects.Length;
byte[] responseData = null;
webRequest.AllowWriteStreamBuffering = true;
using (var dataStream = new StreamWriter(webRequest.GetRequestStream()))
dataStream.Write(jsonResendObjects);
На стороне веб-API
[HttpPost]
public HttpResponseMessage filewriter([FromBody]model mymodel)
{
using (FileStream binaryFileStream = new FileStream("C:\\myNewFile.zip", FileMode.Create, FileAccess.ReadWrite))
{
binaryFileStream.Write(mymodel.binarydata, 0, binaryDatabinarydat.Length);
}
}
Вы проверяли решение от ссылка, я думаю, это очень похоже
According to me, it would be easy to use base64 encoding for communication.
Если ты хочешь это сделать
Сначала преобразуйте файл в byte [], а затем в строку base64.
Нравится:
byte[] bytes = File.ReadAllBytes("path");
string file = Convert.ToBase64String(bytes);
// You have base64 Data in "file" variable
На вашей конечной точке WebAPI строка принятия
[HttpPost]
public HttpResponseMessage filewriter(string fileData)
{
}
Затем преобразуйте вашу строку base64 обратно в byte [] и запишите ее в файл или все, что вы хотите с этим сделать.
Нравится:
// put your base64 string in b64str
Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
And you can Compress your string Using GZIP Like this
public static void CopyTo(Stream src, Stream dest) {
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) {
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str) {
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
//msi.CopyTo(gs);
CopyTo(msi, gs);
}
return mso.ToArray();
}
}
public static string Unzip(byte[] bytes) {
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
using (var gs = new GZipStream(msi, CompressionMode.Decompress)) {
//gs.CopyTo(mso);
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
Ссылка:-
Преобразование файла в base64 и обратно
Михир, что, если мы конвертируем байты файла размером 100 МБ в base64, я знаю, что base64 будет потреблять больше памяти, а мое клиентское приложение winforms написано с 32-битной архитектурой и уже загружено с другими компонентами. Как вы знаете, ОС позволяет использовать только 1,8 ГБ для 32-разрядных приложений.
@CSharpDev Вы использовали сжатие Gzip? он мог творить чудеса. Недавний браузер и сервер используют эту технологию для сжатия. проверьте мой обновленный ответ, сделайте попытку сжатия и убедитесь сами, насколько это влияет на размер вашего файла, это в основном передача вашего файла после его архивирования.
@CSharpDev, если вы не выполняете преобразование base64, которое будет выполняться протоколом http, используемым для транспортировки, потому что http не может передавать двоичные данные без преобразования в формат, такой как base 64.
Хорошо сказал @DanielW.
Я просто почувствовал необходимость сказать, что вы спасли мне жизнь :)
@ gabriel.santos Рад, что этот ответ вам помог.
Стефан, это не для загрузки файла, я хочу загрузить байты, а в методе веб-API это должно записывать байты в файл