Отправка большого файла с клиента на сервер, правильно ли моя логика?

У меня есть относительно большие файлы (1Mb-32Mb), и мне нужно отправить их из настольного приложения в скрипт, написанный на PHP (с помощью фреймворка PHP под названием CodeIgniter). Поскольку файлы довольно большие, я планирую разбить эти файлы на небольшие куски / пакеты, закодировать их каждый с помощью Base64 и отправить их один за другим с помощью сообщения в формате JSON.

У меня есть идея о том, как отправить их на сервер, но я хотел бы сначала спросить вас, что вы думаете об этом, если вы думаете, что все в порядке или если оно испорчено.

Вот. Поскольку английский не является моим родным языком, я предпочитаю показывать его как диалог между двумя субъектами, клиентом и сервером. Я, хотя вы бы поняли немного лучше, что я пытаюсь сделать:

Сообщение # 1:

Клиент: «Привет, сервер, мне нужно отправить вам длинный файл -X-kbytes. Файл, который я вам пришлю, будет иметь контрольную сумму -file_cheksum-»

Сервер: «Хорошо, я готов принять его. Разделите его в -N-маленьких пакетах, каждый с длиной -Y-Kbytes, и отправьте их здесь один за другим, я буду помнить, что делать с ними, если в в вашем сообщении вы сообщаете, что вы отправляете пакеты для сборки файла с идентификатором -FILE_ID- "

Сообщение # 2:

Клиент: «Вот первый пакет -N-, этот пакет необходим для сборки файла с именем -FILE_ID-, и вот контрольная сумма первого пакета, чтобы вы могли проверить, прибыл ли пакет в хорошей форме»

Сервер: «Спасибо, клиент, я только что запомнил его во временной папке. Продолжайте».

Сообщение #N + 1:

Клиент: «Вот -N-пакет -N-, это последний пакет, и требуется собрать файл с именем -FILE_ID-, и вот контрольная сумма последнего пакета, чтобы вы могли проверить, прибыл ли пакет в хорошем состоянии форма»

Сервер: «Спасибо, клиент, я только что собрал все пакеты и проверил контрольную сумму, в результате получился хороший файл. Хорошая работа».

Каждое сообщение будет отправлено через HTTP-сообщение и будет отформатировано с помощью JSON, и каждый пакет, содержащий часть файла, будет закодирован в Base64 и затем декодирован сервером. Вот пример сообщения, отправленного с клиента на сервер:

{ "request": "set-packet", "id": " [ file ID ] ", "packet": { "file": " [ here goes the packet in Base64 ] ", "checksum": " [ here goes the checksum ] " } } 

Если все будет в порядке, сервер ответит:

 { "status": "ok", "message": "packet memorized" } 

Если есть проблема, сервер вместо этого ответил бы, например:

 { "status": "error", "message": "Checksum doesn't match, try again" } 

Что вы думаете об этой логике? Это правильно или неправильно, и не могли бы вы улучшить его?

спасибо

Я считаю, что предлагаемое решение слишком сильно переборщило. Вы выполняете проверки уровня протокола передачи (контрольные суммы пакетов) на уровне приложений (HTTP). Да, это может сработать, но это потихоньку удваивает работу впустую, контрольные суммы пакетов уже происходят на уровне TCP / IP (задолго до уровня абстракции HTTP).

Я также хотел бы найти то, что предложил Дагон, использовать протокол, предназначенный для передачи файлов: FTP (или SSH). Любой общий хост ДОЛЖЕН иметь либо ftp, либо ssh (иначе, как вы получаете на своем сервере какие-либо файлы на своем сервере: P). Ознакомьтесь с ftp http://be.php.net/manual/en/book.ftp.php и ssh http://be.php.net/manual/en/book.ssh2.php расширениями php.

ура

Просто используйте простые загрузки HTTP POST и убедитесь, что upload_max_filesize (настройка php.ini) не менее 32M. Не стоит изобретать колесо здесь.

Существует также класс CI , который может оказаться полезным.