将一个大文件从客户机发送到服务器,我的逻辑是正确的


Sending a large file from a client to a server, is my logic correct?

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

我有一个关于如何将它们发送到服务器的想法,但我想先问一下您的看法,您认为它是好的还是有缺陷的。

在这里。由于英语不是我的母语,我更喜欢将其作为两个主体(客户机和服务器)之间的对话来公开。我想你会更好地理解我在做什么:

消息# 1:

客户端: "你好服务器,我需要给你发送一个- x kb长的文件。我将发送给您的文件的校验和为- file_checksum -"

Server: "Ok,我已经准备好接收它了。把它分成- n个小包,每个包的长度为- y - kb,然后一个接一个地发送到这里,如果你在邮件中提到你要发送包裹,我会记得如何处理它们装配一个ID为- file_id - "

的文件

消息# 2:

Client: "这是- n -的第一个包,这个包需要组装一个名为- file_id -的文件,这是第一个数据包的校验和,这样你就可以检查数据包是否完好无损"

服务器: "谢谢客户,我刚把它记在一个临时文件夹里。继续。"

消息#N + 1:

Client: "这是- n -的- n -包,这是最后一个包,需要组装一个名为- file_id -的文件,这是最后一个数据包的校验和,这样你就可以检查数据包是否完好无损"

服务器: "谢谢客户端,我刚刚把所有的数据包集合在一起并验证了校验和;生成的文件是OK的。好工作。"

每条消息将通过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" 
}

你怎么看这个逻辑?它是正确的还是有缺陷的,你会对它进行改进吗?

谢谢

我认为你建议的解决方案太过分了。在应用层(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扩展

欢呼

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

还有一个CI类,您可能会发现它很有用。