Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Загрузка файла на сервер средствами XMLHttpRequest

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

freddyk

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
http://www.phplivex.com/ajax_file_upload.php

У Вас получилась в этом варианте быстрая загрузка ?
По умолчанию этот загрузчик использует паузы в чтении POST-данных (блоки по 4К каждые 0.1..0.2 сек) и поллинге загруженного размера (0.2 сек) - что выражается в малой (20..40 КБайт/сек) скорости загрузки.  
Я пытался "играть" с другими цифрами задержек - и получил глюки визуализации прогрессбара.
 

Всего записей: 11 | Зарегистр. 23-04-2004 | Отправлено: 01:30 31-07-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
freddyk
зачем вам устаревший фреймворк? он не развивается с 2010 года.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 22:29 31-07-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Забыл выложить свой скрипт, который в результате спаял.
Загружает на сервер "ТОЛЬКО" картинки, отсеиваю другие расширения файлов. Работает с multiple.
 
HTML:

Код:
<form name="uploadphoto"><input type="file" name="photo[]" id="uploadphoto" onchange="LoadPre();" multiple></form>

 
JS:

Код:
/* Upload Photo */
var PhotoList=[];
var fload=false;
var fcount=0;
 
// Это стартовая функция загрузки. Она отбирает картинки с поля и закачивает их.
function LoadPre(){
    if(fload==false){
        fload=true;
        fcount=document.getElementById("uploadphoto").files.length;
        for(var i=0;i<fcount;i++){
            var formData=document.getElementById("uploadphoto").files[i];
            var format=formData.name.replace(/(?:.)+\.(jpg|jpeg|png)/g,"$1");
            if(format=="jpg"||format=="jpeg"||format=="png"){PhotoList.push(formData);}
        }
        fcount=PhotoList.length;
        if(fcount>0){LoadStart(1);}else{LoadEnd();}
    }
    return false;
}
 
//Функция непосредственно загрузки картинок из массива PhotoList
function LoadStart(fnum){
    if(http){
        var format=PhotoList[fnum-1].name.replace(/(?:.)+\.(jpg|jpeg|png)/g,"$1");
        var percent=0;
        http.onload=http.onerror=function(){
            if(this.responseText!="true"){
                alert(this.responseText);    //Выводит ошибку (если она есть)
            }
            if(fcount==fnum){    // Если все фото закачали успешно.
                WLoaded("success","Successfully uploaded ("+fnum+" / "+fcount+") photo!"); // Показывает прогресс загрузки (загружено  3/3 фото)
                LoadEnd(); // Конец загрузки. Освобождение памяти и т.д.
            }else{    //Если есть ещё закачки в очереди.
                LoadStart(fnum+1);    // Возвращаемся к след. файлу....
            }
        };
        http.upload.onprogress=function(event){
            percent = getfloat((event.loaded*100)/event.total);    // Процент загрузки...
            WLoading("Successfully uploaded ("+(fnum-1)+" / "+fcount+") photo. Complete "+getfloat(((fnum-1)*100+percent)/fcount)+"%<br>Loading photo #"+fnum+". Complete "+percent+"%");    // Показывает статус загрузки....
        }
        http.open("POST","upload.php?&format=."+encodeURIComponent(format),true);
        http.send(PhotoList[fnum-1]);
    }
    return false;
}
 
//Освобождение массива и открытие функции LoadPre()
function LoadEnd(){
    fcount=0;
    PhotoList=[];
    document.getElementById("uploadphoto").value="";
    fload=false;
    return false;
}
 
function getfloat(n){
    return Math.floor(n*100)/100;
}
/* ---------------------------- */

 
PHP:

Код:
$name = get_random_string($lenght = 32);
$fload = fopen("./photo/". $name . $_GET["format"], "w+");
while(!feof($file))
{
    $data = fread($file, 100000);
    fwrite($fload, $data);
    unset($data);
}
fclose($file);

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 00:23 21-10-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ManHunter
Такой вопрос, этот скрипт который вы дали, загружает файл на сервер. Но если файл будет большой (5-10мб), то при memory_limit = 64 Мб не хватит памяти его загрузить (Я не знаю почему).
 
Я установил memory_limit = 256 Мб - и файлы до 10-20мб спокойно загружаются. Более большие файлы он не загружает. Меня интересует следующий вопрос, как загружать файлы размером 10 или даже 20 гб? (например как на ex.ua)? И чтоб при этом memory_limit не нужно было увеличивать.

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:34 06-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
Более большие файлы он не загружает. Меня интересует следующий вопрос, как загружать файлы размером 10 или даже 20 гб? (например как на ex.ua)?

либо по частям, либо не через php скрипт.
либо заливать через отдельный сервер с параметрами по максимуму.
по частям, с помощью js - https://github.com/moxiecode/plupload

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 22:48 06-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
либо не через php скрипт

Можно подробней как тут?
 

Цитата:
либо заливать через отдельный сервер с параметрами по максимуму.  

тогда нужна куча серверов, чтоб обработать например одновременное заливание 1000 пользователей по файлу размером в 100гб. (для этого сервер должен иметь больше чем 100гб ОЗУ)
 

Цитата:
по частям

Изучал уже эту тему. Описывается, что загружать огромные файлы тоже нельзя. Поскольку файл будет гранится где-то в JS у клиента, и этого клиент не сможет выдержать....

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:59 08-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
Можно подробней как тут?  

есть куча других языков, принимать файл можно даже в консоли (Разобрать форму с помощью Bash) или же написать свое CGI приложение.
 

Цитата:
тогда нужна куча серверов, чтоб обработать например одновременное заливание 1000 пользователей по файлу размером в 100гб

необязательно, зависит от требований.
 

Цитата:
Поскольку файл будет гранится где-то в JS у клиента, и этого клиент не сможет выдержать...

не будет, будет считываться только нужная часть.
 
https://www.html5rocks.com/en/tutorials/file/dndfiles/

Цитата:
In some cases reading the entire file into memory isn't the best option. For example, say you wanted to write an async file uploader. One possible way to speed up the upload would be to read and send the file in separate byte range chunks. The server component would then be responsible for reconstructing the file content in the correct order.
 
Lucky for us, the File interface supports a slice method to support this use case. The method takes a starting byte as its first argument, ending byte as its second, and an option content type string as a third.

 

Код:
var blob = file.slice(startingByte, endindByte);
reader.readAsBinaryString(blob);

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 23:06 08-11-2016 | Исправлено: Mavrikii, 23:32 08-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
в любом случаю, загружать огромные файлы можно только кусками?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 18:22 09-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
загружать огромные файлы можно только кусками?

напишите свой вариант сервера - можете принимать целиком, сбрасывая сразу на диск.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 20:58 09-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
напишите свой вариант сервера

Попробую сделать реализацию загрузки файла по 1-2мб за кусок.
Т.е. написать свой сервер?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 17:40 10-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
Т.е. написать свой сервер?

взять и написать приложение или скрипт, слушающее порт и выполняющее какой то набор http команд или свои. делов то.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 21:05 10-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ещё такой вопрос.
1. Что происходит с XMLHttpRequest(), если я начал отправлять данные и вызывается alert() или ещё что-то? Он становится на паузу?
2. Если сделать r.abort(), что происходит с запросом?
 
1. У меня в Опере пауза.
2. В onreadystatechange readyState 0 и потом 4. status всегда равен 0.
 
Вопрос, так во всех брандмауэрах?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 15:53 13-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
Он становится на паузу?  

с модальными окнами, обычно, все замораживается.
 

Цитата:
Если сделать r.abort(), что происходит с запросом?  


Цитата:
The XMLHttpRequest.abort() method aborts the request if it has already been sent. When a request is aborted, its readyState is set to 0 (UNSENT), but the readystatechange event is not fired.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 21:28 14-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Вообщем реализовал этот способ загрузки (загрузка файла частями).
Такие вопросы,
первое, в любом случае, если загружать файл частями, кусок, который мы отправили обязательно сохраняется и потом к нему дописывается следующий кусок?
 
и второй, какой вообще метод более простой и лучший? У меня с методом JS разбивать файл на куски, отправлять кусочки и их записывать - вызывает сильную нагрузку на ЦП. Это нормально?
 
и третье, я отправляю кусочки файлов через readAsBinaryString(), когда открываешь файл после загрузки - русский текст кириллица. Как это исправить?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 18:18 17-11-2016 | Исправлено: Sutar, 20:16 17-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
мы отправили обязательно сохраняется и потом к нему дописывается следующий кусок

самостоятельно - нет, нужно на сервере склеивать.
 

Цитата:
какой вообще метод более простой и лучший?

из чего?
 

Цитата:
меня с методом JS разбивать файл на куски, отправлять кусочки и их записывать - вызывает сильную нагрузку на ЦП. Это нормально?  

я не вижу вашего кода, но нагрузки сильной быть не должно.
 

Цитата:
отправляю кусочки файлов через readAsBinaryString(), когда открываешь файл после загрузки - русский текст кириллица. Как это исправить?

перечитайте свой вопрос. из него непонятно о какой проблеме идет речь.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 21:21 17-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
из чего?  

из комбинаций
js [XMLHttpRequest] + php,
js [сокет] + python или php
js [XMLHttpRequest] + swf + php
 

Цитата:
я не вижу вашего кода, но нагрузки сильной быть не должно.  

_flists - содержит несколько файлов.
_travel - файл, который сейчас загружаем.
_tact - сколько байт передано (изначально = 0, потом суммируется с _tact_size).
_tact_size - размер передаваемого файла (у меня стоит 1024*1024*3)
 

Код:
_load: function() {
        try {
            var reader = new FileReader();
            var blob = _flists[_travel].slice(_tact, (_tact + _tact_size));
            reader.onload = function(event) {
                fload._sends(event.target.result);
                return;
            }
            reader.readAsBinaryString(blob);
        } catch(e) {
            error._handle(e);
        }
        return false;
    },
    _sends: function(body) {
        var r = ajax._getini();
        try {
            r.onload = r.onerror = function() {
                if(this.responseText != 'true') {
                    error._handle(this.responseText);
                } else {
                    _tact += _tact_size;
                    if(_tact < _flists[_travel].size) {
                        console.log(round(((_tact+event.loaded)*100)/_flists[_travel].size) + '%'); // Процент загрузки файла....
                        fload._load();
                    } else {
                        _travel++;
                        if(_flists.length == _travel) {
                            _lact = false;
                        } else {
                            _tact = 0;
                            fload._load();
                        }
                    }
                }
                return;
            };
            r.open("POST", './?upload=&POST=&name=' + _flists[_travel].name, true);
            r.send(body);
        } catch(e) {
            error._handle(e);
        }
    }

 

Цитата:
перечитайте свой вопрос. из него непонятно о какой проблеме идет речь.

после загрузки файла кусками на сервер (в данном случае загружается файл с export.csv, в нем содержится русский и английский текст), текст в файле получается таким:
 

Код:
&#193;&#229;&#237;&#231;&#232;&#237;&#238;&#226;&#251;&#233; &#241;&#237;&#229;&#227;&#238;&#243;&#225;&#238;&#240;&#249;&#232;&#234; Husqvarna ST 121E;0.00;

кодировка файла Utf-8 сохраняется.

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 00:50 18-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
js [XMLHttpRequest] + php,  
js [сокет] + python или php  
js [XMLHttpRequest] + swf + php  

зачем там еще swf?
и в чем разница между xmlhttprequest и socket? смысл то почти один и тот же.
 

Цитата:
Код:

не должно это грузить процессор, возможно что то в цикле идет, когда не нужно.  
либо одновременно много подключений генерится.
 

Цитата:
кодировка файла Utf-8 сохраняется.


Цитата:
If the data is a Document, it is serialized before being sent. When sending a Document, versions of Firefox prior to version 3 always sends the request using UTF-8 encoding; Firefox 3 properly sends the document using the encoding specified by body.xmlEncoding, or UTF-8 if no encoding is specified.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 01:05 18-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
зачем там еще swf?  
и в чем разница между xmlhttprequest и socket? смысл то почти один и тот же.  

да я пытаюсь сделать загрузку сразу несколько файлов по очереди частями. Есть 2 проблемы. (1 - всё пишет в один и тот-же файл, 2 - кодировка).
1 - можно решить предварительно послав запрос на создание файла с определенным именем, и получить ответ файла который создался (если он был изменен), и потом посылать куски в новый файл и дописывать их туда.
2 - я не знаю как решить(
 

Цитата:
не должно это грузить процессор, возможно что то в цикле идет, когда не нужно.  
либо одновременно много подключений генерится.  

если уменьшить размер куска - нагрузка больше. Если сделать (2-4мб за кусок), так вроде нормально. Ещё экспериментирую. Правда не понятно, нагрузка на клиенте или сервер, ибо всё на одной машине))
 
Решение с кодировкой добавить заголовок utf-8?
Например:

Код:
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 01:15 18-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
можно решить предварительно послав запрос на создание файла с определенным именем,

смысл? генерится в js уникальный id, по нему и склеивается. можно генерить перед выводом формы на сервере (id сессии), возвращать в куках и не только - способов куча.
 

Цитата:
 
если уменьшить размер куска - нагрузка больше.  

проверять, что не идет куча отправок параллельно, ограничивать число.
 

Цитата:
Решение с кодировкой добавить заголовок utf-8?  

пробуйте, зачем спрашивать? вот только кодировка должна соответствовать кодировке файла
http://stackoverflow.com/questions/12448595/get-set-file-encoding-with-javascripts-filereader
http://stackoverflow.com/questions/3146483/html5-file-api-read-as-text-and-binary

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 01:20 18-11-2016
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
генерится в js уникальный id, по нему и склеивается. можно генерить перед выводом формы на сервере (id сессии), возвращать в куках и не только - способов куча.  

А как на сервере распознать id?
Тут нужно учесть загрузку одновременно разных файлов (при этом, можно добавить в загрузку ещё файлы, и файлы могут повторятся (одинаковые)), и их нужно все грузить отдельно....

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 01:31 18-11-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Интернет » Web-программирование » Загрузка файла на сервер средствами XMLHttpRequest


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru