从客户端向服务器发送大文件,我的逻辑是否正确?

时间:2011-09-19 06:29:33

标签: php json rest

我有一些相对较大的文件(1Mb-32Mb),我需要将它们从桌面应用程序发送到用PHP编写的脚本(借助于名为CodeIgniter的PHP框架)。由于文件很大,我正在考虑将这些文件拆分成小块/数据包,用Base64对每个文件进行编码,然后通过JSON格式的消息逐个发送。

我对如何将它们发送到服务器有一个想法,但我想先问你,如果你认为它是好的,或者它是否存在缺陷,你会怎么想呢。

在这里。由于英语不是我的母语,我更喜欢将它作为两个主题(客户端和服务器)之间的对话框进行公开。我虽然你会更好地了解我想要做的事情:

消息#1:

客户端:“嗨服务器,我需要发送一个-X-kbytes长文件。我发给你的文件将有-file_cheksum的校验和 - ”

服务器:“好的我已准备好接收它了。将它拆分成-N-小数据包,每个数据包的长度为-Y-千字节,并将它们逐个发送到此处,I如果在你的消息中提到你正在发送包裹,请记住如何处理它们 使用ID -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 个答案:

答案 0 :(得分:1)

我相信你建议的解决方案太过分了。你正在应用层(HTTP)上进行传输协议级别检查(数据包校验和)。是的,它可以工作,但它几乎没有任何工作,数据包校验和已经发生在TCP / IP级别(早在HTTP抽象级别之前)。

我也会选择Dagon所建议的,使用用于文件传输的协议:FTP(或SSH)。任何共享主机应该有ftp或ssh(否则,你如何在服务器上获得任何文件:P)。查看php的ftp http://be.php.net/manual/en/book.ftp.php和ssh http://be.php.net/manual/en/book.ssh2.php扩展名。

干杯

答案 1 :(得分:0)

只需使用简单的HTTP POST uploads并确保upload_max_filesize(php.ini设置)至少为32M。这里没有重新发明轮子。

您还可以找到有用的CI class