Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将大文件从客户端发送到服务器,我的逻辑正确吗?_Php_Json_Rest - Fatal编程技术网

Php 将大文件从客户端发送到服务器,我的逻辑正确吗?

Php 将大文件从客户端发送到服务器,我的逻辑正确吗?,php,json,rest,Php,Json,Rest,我有一些相对较大的文件(1Mb-32Mb),我需要将它们从桌面应用程序发送到用PHP编写的脚本(借助一个名为CodeIgniter的PHP框架)。由于这些文件相当大,我正在考虑将这些文件分成小块/数据包,用Base64对每个文件进行编码,并通过JSON格式的消息逐个发送 我对如何将它们发送到服务器有一个想法,但我想首先问你,如果你认为它是正确的,或者它有缺陷,你会怎么想 给你。由于英语不是我的母语,我更喜欢将它公开为两个主题之间的对话,一个客户端和一个服务器。我想你会更明白我想做什么: 信息#1

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

我对如何将它们发送到服务器有一个想法,但我想首先问你,如果你认为它是正确的,或者它有缺陷,你会怎么想

给你。由于英语不是我的母语,我更喜欢将它公开为两个主题之间的对话,一个客户端和一个服务器。我想你会更明白我想做什么:

信息#1:

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

服务器:“好的,我准备好接收它了。将它分成-N个小数据包,每个数据包的长度为-Y-Kbytes,然后一个接一个地发送到这里,如果您在邮件中提到您要将包发送到 组装一个ID为-file\u ID的文件-

信息#2:

客户端:“这是-N-的第一个数据包,需要这个数据包来组装名为-file\u ID-的文件, 这是第一个数据包的校验和,因此您可以检查数据包是否以良好的状态到达”

服务器:“谢谢你,客户,我刚刚在一个临时文件夹中记住了它。继续。”

信息#N+1:

客户端:“这是-N-包中的-N-包,这是最后一个包,需要它来组装一个名为-file\u 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" 
}
你怎么看待这个逻辑?它是正确的还是有缺陷的,你会对它进行改进吗


谢谢你

我认为你建议的解决方案太过分了。。您正在应用层(HTTP)上执行传输协议级别的检查(数据包校验和)。是的,它可以工作,但它几乎是免费工作的两倍,数据包校验和已经发生在TCP/IP级别(早在HTTP抽象级别之前)

我也会按照Dagon的建议,使用一个用于文件传输的协议:FTP(或SSH)。任何共享主机都应该具有ftp或ssh(否则,首先您如何在服务器上获取任何文件:P)。签出php的ftp和ssh扩展

干杯

只需使用simple,并确保upload_max_filesize(php.ini设置)至少为32M。在这里重新发明轮子没有意义


还有一个问题您可能会发现很有用。

问题是服务器可能安装在托管网站上。不幸的是,FTP访问可能并不总是一个选项。