LINUX.ORG.RU

Загрузка на сервер файлов с большим размером


0

0

Не могу реализовать загрузку больших файлов. В тексте CGI использую 64-битные переменные для размеров, но сам сервер отдает неправильный CONTENT_LENGTH - всего около 8КБ и ругается:

Invalid method in request \xb5\xadkZ\xd6\xb5\xad
Причем никаких X-Content-Range в заголовках нет... Периодически выскакивают такие ошибки:
[Mon Jun 20 00:48:13 2011] [error] [client 127.0.0.1] Invalid Content-Length, referer: https://localhost/auth_test
[Mon Jun 20 00:48:13 2011] [error] [client 127.0.0.1] (-3)Unknown error 4294967293: Error reading request entity data, referer: https://localhost/auth_test

Подскажите: как реализовать загрузку файлов любых размеров?

☆☆☆☆☆

Телепаты как всегда в отпуске. Какой httpd? Он у тебя по таймауту банально не рубит соединение?

Ramen ★★★★
()
Ответ на: комментарий от Ramen

По таймауту не рубит: файлы размером меньше 2ГБ нормально загружаются, большие же файлы сразу приводят к ошибке.

Пока нашел только один способ: порезать на куски файл посредством javascript и отправить его несколькими запросами. Но по-моему, это какой-то очень геморройный способ.

Неужели ничего проще нет?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Ну... вообще HTTP совершенно не предназначен для заливки файлов от клиента на сервер.
И ты так и не ответил, что у тебя крутится в качестве httpd.

Ramen ★★★★
()
Ответ на: комментарий от Eddy_Em

А вообще, в принципе - с маленькими файлами все ОК, а грузить BD-рипы при помощи http, наверное, не слишком хорошая идея :)

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

Ой спасибо, а я, дурак, и не знал...

Eddy_Em ☆☆☆☆☆
() автор топика

> Не могу реализовать загрузку больших файлов. В тексте CGI использую 64-битные переменные для размеров, но сам сервер отдает неправильный CONTENT_LENGTH - всего около 8КБ и ругается:

а кстате-говоря — какие из броузеров на данный момент способны upload`ить файлы размер-которых больше 2G ?

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Я, честно говоря, об этом не подумал..

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Shtucer

А как сделать в браузере активное ftp-соединение?

// а так у меня, ясен пень, ftp работает...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Зачем в броузере делать то, для чего браузкр не очень предназначен? Если ftp уже работает, зачем плодить лишние сущности?

Shtucer
()
Ответ на: комментарий от Shtucer

Просто пилю CGI-библиотеку, вот и заморочился, что большие файлы не проскакивают. Раз уж это нормально, то я просто забью. Если бы оказалось, что должны проходить - разбирался бы дальше.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от kommersant

Вы по ссылочке-то читали? Там максимум 1Гб пролезает. У меня свободно пролезает двухгигабайтный файл.

А «обратную связь» я тоже пилить буду. Это несложно.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от adepto

При чем здесь память? Я, конечно, в подробности не вдавался, но временный файл создаю на диске, забирая из запроса данные порциями по 16к.

Или апач это все дело сначала в оперативку пытается запихнуть? О_о

Eddy_Em ☆☆☆☆☆
() автор топика

Может, не нужно грузить такие файлы за один раз, а лучше сделать более устойчивое решение на FileReader?

note173 ★★★★★
()
Ответ на: комментарий от Eddy_Em

Это из нового течения html5: из яваскрипта можно читать локальные файлы, примерно как на флеше. Отправлять вручную. Кстати, можно и на флеше сделать загрузчик.

note173 ★★★★★
()
Ответ на: комментарий от note173

из яваскрипта можно читать локальные файлы [/qutoe] Вот я и читал, что можно взять файл, порезать его на кусочки яваскриптом, а потом отправить.

можно и на флеше сделать загрузчик

Изыди!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Но тормоза были жуткие.

неужели и правда этот дебильный апач весь текст POST-запроса закидывает в оперативку?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

У апача есть LimitRequestBody, который лежит между 0(типа сколько влезет) и 2GB. Так, вот дефолтом стоит ноль. Но дофига рецептов на эту тему было - либо аяксом отправляется по-кусочкам, зато можно сразу мутить прогрессбар; либо другие костыли типа флешандра или явааплета.

Shtucer
()
Ответ на: комментарий от Shtucer

Прогресбар и без кусочков можно замутить - по таймеру обращаться к серверу и получать ответ - сколько %% скопировано.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Shtucer

По кусочкам не хочу заморачиваться - придется контролировать номера кусков, а также принадлежат ли они одному и тому же файлу.

Просто плюну: до 2ГБ хватит, раз уж больше - только через костыли.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Такое впечатление, что тащишь ты этот код на своем горбу...

Shtucer
()
Ответ на: комментарий от Eddy_Em

30 кб, при том, что ты собираешься отправлять больше 2 Гб)

По кусочкам не хочу заморачиваться

Даже в локалке 4 гигабайта не факт что с первой попытки загрузятся

note173 ★★★★★
()
Ответ на: комментарий от note173

Даже в локалке 4 гигабайта не факт что с первой попытки загрузятся

Ну я уже и решил плюнуть на загрузку больших файлов. Можно вообще ограничение, скажем, на 1ГБ поставить.

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.