Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.04.2020, 17:04
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как отправить картинку имеющийся в Base 64 на сервер?
Мне нужно сделать так, чтобы когда я добавляла картинку она отображалась в html документе, после добавление нескольких картинок, можно было одной кнопкой submit отправить их всех на сервер. Кое-какие работы я уже сделала например преобразовала base 64 в blob и полученный результат вывела в html документ. Когда поле с файлами меняется срабатывает change и там уже идёт преобразование и отображение в html документе. Как теперь все добавленные файлы в html документ одним нажатием на submit отправить на сервер? Например добавила пять картинок потом их отправила при нажатии submit.
Вот код:
<HTML>
<HEAD>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<title>Загрузка нескольких файлов</title></HEAD>
<body>

<script>
$(document).ready(function(){
    $('#form_upload').on('change', 'form input[type=file]', function()
    {
        var input = this;
        if (input.files && input.files[0]) {
            var file = input.files[0],
                reader = new FileReader();

            reader.onload = function(e){
                var fileData = e.target.result,
                    parts, type, base64Data;

                parts = fileData.split(',');
                type = parts[0];
                base64Data = parts[1];

                type = type.split(';')[0].split(':')[1];

                var blobImage = b64toBlob(base64Data, type);
                
                const blobUrl = URL.createObjectURL(blobImage);
  
                const img = document.createElement('img');
                img.src = blobUrl;
                document.body.appendChild(img);

                
            }

            reader.readAsDataURL(file);
        }

    });
    $('#form_upload').on('submit', function(event){
      event.preventDefault();
      //При щелчке на сервер должны загружаться картинки
    });
});
function b64toBlob(b64Data, contentType, sliceSize) {
  
  contentType = contentType || '';
  
  sliceSize = sliceSize || 512;

  var byteCharacters = atob(b64Data);
  var byteArrays = [];

  for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);

    var byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
  }

  var blob = new Blob(byteArrays, {type: contentType});
  
  return blob;
}
</script>

<form id="form_upload" action="" method="POST">
    
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <input name="userfile" type="file"/>
    <input type="submit" value="Отправить">
</form>

</BODY>
</HTML>

Последний раз редактировалось Katy93, 16.04.2020 в 17:09.
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2020, 17:09
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

https://developer.mozilla.org/ru/doc...ormData/append
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2020, 17:11
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Зачем вы изображение читаете с помощью FileReader'а, затем конвертируете base64 в blob, если все равно скармливаете blob методу «URL.createObjectURL»?
https://developer.mozilla.org/ru/doc...reateObjectURL
Посмотрите на параметры, которые может принимать этот метод.

Вы можете полученный файл сразу скормить методу URL.createObjectURL и получить туже самую ссылку.

P.S. не забывайте освобождать память от мусора с помощью метода «URL.revokeObjectURL». Сейчас вы его не используете, а стоит.

Последний раз редактировалось Nexus, 16.04.2020 в 17:14.
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2020, 17:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Походу base64->blob вообще лишнее тут, если только с файлами не производится преобразование на клиенте.
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2020, 17:24
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как загрузить на сервер, так никто не сказал.
Ответить с цитированием
  #6 (permalink)  
Старый 16.04.2020, 17:27
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от Katy93
Как загрузить на сервер, так никто не сказал.
А вы гуглить не пробовали?
Даже на этом форуме есть уйма результатов.

$('#form_upload').on('submit', function(event) {
    event.preventDefault();
  
    $.ajax({
        url: this.action,
        type: this.method,
        data: new FormData(this),
        contentType: false,
        processData: false,
        cache: false,
        success: function(response) {
            // handle response
        }
    });
});
Ответить с цитированием
  #7 (permalink)  
Старый 16.04.2020, 17:41
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Цитата:
А вы гуглить не пробовали?
Пробовала но подходящих вариантов не нашла.
Ответить с цитированием
  #8 (permalink)  
Старый 16.04.2020, 17:41
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

<form id="form_upload" action="/path-to-handler" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="30000"/>
    <input name="userfiles[]" type="file" multiple/>
    <div id="previews"></div>
    
    <input type="submit" value="Отправить"/>
</form>

<style>
  img {
    max-width: 150px;
    margin-right: 5px;
  }
</style>

<script>
  document.addEventListener('DOMContentLoaded', function () {
    const form = document.querySelector('#form_upload');
    const inputFile = form ? form.querySelector('[name="userfiles[]"]') : undefined;

    if (!form || !inputFile) {
      return void console.error('Form of input[type=file] not found');
    }

    const imagesPreviews = [];
    const previewsContainer = document.querySelector('#previews');

    inputFile.addEventListener('change', function () {
      if (!previewsContainer || !this.files) {
        return;
      }

      previewsContainer.innerHTML = '';

      let objectUrl;
      while (objectUrl = imagesPreviews.shift()) {
        URL.revokeObjectURL(objectUrl);
      }

      [].forEach.call(this.files, function (file) {
        const objectUrl = URL.createObjectURL(file);
        const image = document.createElement('img');

        image.alt = file.name;
        image.src = objectUrl;

        previewsContainer.appendChild(image);
        imagesPreviews.push(objectUrl);
      });
    });

    form.addEventListener('submit', function (e) {
      e.preventDefault();

      fetch(this.action, {
        method: this.method,
        body: new FormData(this)
      }).then(function (res) {
        return res.json();
      }).then(function (response) {
        // handle response
      });
    });
  });
</script>
Ответить с цитированием
  #9 (permalink)  
Старый 20.04.2020, 20:39
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Уже несколько дней пытаюсь выполнить пример выше. Пересмотрела много информации в сети, не работает пример. Проблема с res.json()
Цитата:
Uncaught (in promise) SyntaxError: Unexpected token <
Ответить с цитированием
  #10 (permalink)  
Старый 20.04.2020, 21:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сервер возвращает не json или его, но с "грязью".
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при клики повернуть картинку на 45% byM Общие вопросы Javascript 1 05.08.2015 17:15
Как отправить форму на другой домен? lucky89 AJAX и COMET 4 28.04.2015 12:01
как обернуть картинку в <a> c ссылкой на саму картинку ufaclub jQuery 1 17.07.2014 22:45
Как отправить multiple select на сервер Hapson AJAX и COMET 9 17.03.2014 00:45
Как отправить форму после preventDefault()? Rooner jQuery 4 09.10.2012 16:58