Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.09.2015, 00:17
Интересующийся
Отправить личное сообщение для dimensi Посмотреть профиль Найти все сообщения от dimensi
 
Регистрация: 07.09.2015
Сообщений: 20

Как отправлять файлы через type='file' на js скрипт?
Нашел на хабхабре статью, о том как посылать письма использую почтовый сервис через JS язык. Сначала у меня были проблемы с тем, чтоб просто отправлять письма ибо знания в js у меня очень слабые. Учил учил, а материал не закрепил, поэтому одни сплошные дыры в ajax, js и в dom. Сначала я понял как прицепить к кнопке функцию и посылать письмо. Потом после долгих поисков в google нашел способ как с помощью формы посылать письма.
var xmlhttp = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open('POST', 'https://mandrillapp.com/api/1.0/messages/send.json');
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
        if(xmlhttp.status == 200) alert('Спасибо за заявку, в скором времени вам перезвоним!')
        else if(xmlhttp.status == 500) alert('Check apikey')
        else alert('Request error');
    }
}

window.addEventListener('DOMContentLoaded', function(){
     var form = document.querySelector('#sendForm');
    
      form.addEventListener('submit', function (e) {
        e.preventDefault();
        sendMail(this.elements.sub.value, this.elements.text.value);
      }, false);
}, false);

function sendMail(sub, text){ 
	xmlhttp.send(JSON.stringify({'key': 'puturApikey',
   'message': {
       'from_email': 'test@mail.ru',
       'to': [{'email': 'totest@mail.ru', 'type': 'to'}],
       'autotext': 'true',
       'subject': sub
       'html': text
    }}));}

Я был несказанно рад своему открытию и возможности посылать письмо через этот скрипт с помощью формы. Дальше я узнал в API почтового сервиса могу еще и файлы прикреплять и изображения.

Я подумал, что добавление this.elements.images.value хватит, чтоб посылать файлы, но понял, что не прав. Я так понял, что я должен вытаскивать из файлы тип файла, название файла и base64 файла. Как это сделать, я в гугле не нашел. А быстрое пролистывание учебника вашего ресурса тоже не помогло. Скажите, как реализовать отправку изображений через обычный input type=file? Чтоб сразу несколько можно было. Заранее спасибо.

Последний раз редактировалось dimensi, 07.09.2015 в 00:25.
Ответить с цитированием
  #2 (permalink)  
Старый 07.09.2015, 02:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от dimensi
Как это сделать, я в гугле не нашел.
Смотря что искать - filereader.
Ответить с цитированием
  #3 (permalink)  
Старый 07.09.2015, 18:29
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,598

Примерно так, однако фалы читать могут только современные браузеры
var xmlhttp = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open('POST', 'https://mandrillapp.com/api/1.0/messages/send.json');
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
        if(xmlhttp.status == 200) alert('Спасибо за заявку, в скором времени вам перезвоним!')
        else if(xmlhttp.status == 500) alert('Check apikey')
        else alert('Request error');
    }
}

 
window.addEventListener('DOMContentLoaded', function(){    
    var form = document.querySelector('#sendForm');   
    var attachments = [];       
    var submit = form.querySelector('input[type="submit"]');
    var files = form.querySelector('#files');
    
    files.addEventListener('change', function() {
        var files = this.files, i = files.length;  
        if(!i) return attachments = [];   
        submit.disbled = true; //не даём отправлять форму пока не подгрузит аттачи
        
        var reader  = new FileReader();
        var newAttachments = [];
        reader.onload = function () {
            var index = reader.result.indexOf(';base64,');
            newAttachments.push({       
                type: reader.result.slice(5, index),
                name: files[i].name,
                content: reader.result.slice(index + 8)
            });
            if(i--) reader.readAsDataURL(files[i]); 
            else {
                submit.disbled = false;
                attachments = newAttachments;
            };
        }
        reader.readAsDataURL(files[--i]);
    }, false);
    

    form.addEventListener('submit', function (e) {
        e.preventDefault();
        sendMail(this.elements.sub.value, this.elements.text.value, attachments);
    }, false);
}, false);
 

function sendMail(sub, text, attachments){
    xmlhttp.send(JSON.stringify({'key': 'puturApikey',
   'message': {
       'from_email': 'test@mail.ru',
       'to': [{'email': 'totest@mail.ru', 'type': 'to'}],
       'autotext': 'true',
       'subject': sub,
       'html': text,
       'attachments': attachments
	}}));
}
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 08.09.2015, 00:46
Интересующийся
Отправить личное сообщение для dimensi Посмотреть профиль Найти все сообщения от dimensi
 
Регистрация: 07.09.2015
Сообщений: 20

Все отлично работает, спасибо вам большое. Еще вопрос как сделать ограничение по размеру файла и количеству файлов? Есть поставить значение мультипли, то он грузит, несколько файлов, что круто, но одновременно плохо, потому, что если захотят отправить 20 фоток или 10 фоток по 10мб, то это капец же будет) Заранее спасибо.
Ответить с цитированием
  #5 (permalink)  
Старый 08.09.2015, 07:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от dimensi
Еще вопрос как сделать ограничение по размеру файла и количеству файлов?

То есть читать не хотим? Загруженные изображения, это их массив files, а это i = files.length; их количество. И кроме имени загружаемого файла files[i].name, можно получить и его размер в байтах - files[i].size.

Количество загружаемых файлов, размер одного загружаемого файла и общий размер загружаемых данных, эти параметры определяются сервером.
Ответить с цитированием
  #6 (permalink)  
Старый 08.09.2015, 08:51
Интересующийся
Отправить личное сообщение для dimensi Посмотреть профиль Найти все сообщения от dimensi
 
Регистрация: 07.09.2015
Сообщений: 20

Ну не то что бы не хочу читать, просто я не хрена не понимаю. Я это прочитал, но не хрена не понял. Разве на клиентской стороне нельзя сделать ограничения? Я знаю, что их можно обойти, но это будет защита от дурака обычного, а не продвинутого.
Ответить с цитированием
  #7 (permalink)  
Старый 08.09.2015, 09:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от dimensi
Разве на клиентской стороне нельзя сделать ограничения?
Почему нельзя, можно, но нужно руководствоваться ограничением сервера, то есть сервисом, которым вы пользуетесь. Другими словами, нельзя на клиенте выставить максимум больший, чем определен сервером.
К тому же, на отправку почты обычно также накладываются ограничения, такие как одновременно отправляемых сообщений в единицу времени (вас это не лимитирует, если только ваша цель не рассылка), размер почтового сообщения, в частности размер прикрепленных к нему файлов.

Все эти параметры нужно знать.
Ответить с цитированием
  #8 (permalink)  
Старый 08.09.2015, 18:31
Интересующийся
Отправить личное сообщение для dimensi Посмотреть профиль Найти все сообщения от dimensi
 
Регистрация: 07.09.2015
Сообщений: 20

Моя цель создать форму обратного вызова. Человек пишет данные, прикрепляет фотки и на почту приходит сообщение. Я просто хочу сделать ограничение в 10 файлов и 3 мб размер фотки. Я понял, что я должен выставить if else и в ней поставить ограничение на размер и количество. Но как это сделать, я не знаю.
Ответить с цитированием
  #9 (permalink)  
Старый 08.09.2015, 18:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от dimensi
ограничение в 10 файлов и 3 мб размер

Данные в base64 это почти в три раза больший объем данных, чем исходные. 10 * 3 * 3 = 90 МБ. Вы уверены, что такой размер почтового отправления этот сервис примет?

А проверить, это: если files.length > 10 или files[i].size > 3145728, то или выход, или сообщение и выход, не знаю чего вам нужно. А проверку производить перед reader.onload = function () {...
Ответить с цитированием
  #10 (permalink)  
Старый 08.09.2015, 19:33
Интересующийся
Отправить личное сообщение для dimensi Посмотреть профиль Найти все сообщения от dimensi
 
Регистрация: 07.09.2015
Сообщений: 20

Ну я отправил 20 фотографий по 1мб-5мб, он все прислал :/
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подгрузить код JS динамически? zhurchik Общие вопросы Javascript 22 02.02.2015 14:16
Как передать значение из php в html через js Mateus jQuery 5 26.12.2012 22:24
Как передавать параметры из php скрипта в js imissyouso Общие вопросы Javascript 3 01.08.2012 18:24
есть ли в js понятие частоты кадров, наподобие как во флэше? andrew_F Общие вопросы Javascript 8 01.05.2012 20:25
Как реализовать отключения JS кода через админку ? lamer Серверные языки и технологии 4 08.02.2012 17:23