2017-01-12 3 views
1

Я использую программу чтения файлов в JavaScript, мне нужно отправить изображение в WebApi и преобразовать его в массив байтов и сохранить его на сервере. Его работа прекрасна. Теперь моя проблема - base64 string увеличение размера изображения, Пусть говорят, если я загрузить изображение 30 КБ, это хранение имеет 389Kb сервер, Как я могу сохранить в том же размере или уменьшить размер изображения должен помочьУменьшить размер изображения при преобразовании в Base64

//File Reader 
function OnFileEditImageEntry(file) { 
var reader = new FileReader(); 
reader.onloadend = function (evt) { 
    var ImageBase64 = evt.target.result; 
    return ImageBase64 ; 
}; 
reader.readAsDataURL(file); 
} 

//WEB API// 
public IHttpActionResult UpdateUserDetails(ImageModel model) 
{ 

    try 
    { 
     if (model.ImageBase64 != "") 
     { 
      var PicDataUrl = ""; 
      string ftpurl = "ftp://xxx.xxxxx.xxxx/"; 
      var username = "xxx"; 
      var password = "xxxxx"; 
      string UploadDirectory = "xxxx/xx"; 
      string FileName =model.ImageFileName; 
      String uploadUrl = String.Format("{0}{1}/{2}", ftpurl, UploadDirectory,FileName); 
       FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl); 
       req.Proxy = null; 
       req.Method = WebRequestMethods.Ftp.UploadFile; 
       req.Credentials = new NetworkCredential(username, password); 
       req.EnableSsl = false; 
       req.UseBinary = true; 
       req.UsePassive = true; 
       byte[] data =Convert.FromBase64String(model.ImageBase64); 
       req.ContentLength = data.Length; 
       Stream stream = req.GetRequestStream(); 
       stream.Write(data, 0, data.Length); 
       stream.Close(); 
    } 
     } 
    } 
+1

Почему вы не отправить его как необработанные байты? Преобразование в Base64 определенно влияет на размер и производительность. В зависимости от фактических данных, которые вы отправляете, применяя сжатие gzip к этим необработанным байтам, можно еще больше уменьшить размер. Но, учитывая, что вы загружаете изображения, они уже сжаты (если вы не используете необработанный формат), и gzip не принесет вам большой пользы. –

+0

Я попробовал reader.readAsBinaryString (файл); в файловом считывателе, он не дает двоичных данных, он дает мне некоторую случайную строку, поэтому я не могу преобразовать ее в массив байтов в webApi – Nikil

+0

Различные форматы будут иметь разные размеры, поэтому, если вы не перевернете их обратно в исходный формат, тогда вам нужно ожидать это. Обычный подход к изображениям заключается в том, чтобы сохранить изображение (как изображение, а не строку base64) в папке, а затем просто сохранить имя файла в базе данных. Есть плюсы и минусы для всех способов обработки загруженных изображений, но для меня это самый ясный способ сделать это (плюс это уменьшает время загрузки страницы, если вы когда-либо захотите отображать изображения на веб-сайте). – Archer

ответ

0

Отправить необработанный бинарный файл вместо увеличивая размер ~ 30% с base64/FileReader

с выборкой

// sends the raw binary 
fetch('http://example.com/upload', {method: 'post', body: file}) 

// Append the blob/file to a FormData and send it 
var fd = new FormData() 
fd.append('file', file, file.name) 

fetch('http://example.com/upload', {method: 'post', body: fd}) 

С XHR

// xhr = new ... 
// xhr.open(...) 

xhr.send(file) // or 
xhr.send(fd) // send the FormData 

Обычно при загрузке файлов, попытайтесь избежать отправке JSon как многие разработчики, как правило, к правонарушению. Бинарные данные в формате JSON равно плохой практикой (и большего размера), например:

$.post(url, { 
    name: '', 
    data: base64 
}) 

Используйте FormData # Append как можно больше, или если вы чувствуете, как он:

fd.append('json', json) 
Смежные вопросы