Правильна ли моя логика при отправке большого файла с клиента на сервер? - PullRequest
2 голосов
/ 19 сентября 2011

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

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

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

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

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

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

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

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

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

...

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

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

Сервер: " Спасибо клиент, я только что собрал все пакеты и проверил контрольную сумму;Полученный файл в порядке.Хорошая работа. "

Каждое сообщение будет отправлено через HTTP Post и будет отформатировано с помощью 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" 
}

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

Спасибо

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Я полагаю, что предложенное вами решение слишком излишне. Вы выполняете проверки уровня протокола передачи (контрольные суммы пакетов) на прикладном уровне (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.

Приветствия

0 голосов
/ 20 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...