一、前言在网站开发中,经常会有上传文件的需求。有些文件体积过大,直接上传,往往导致上传过程耗时长,占用大量带宽资源。因此,分段上传。分片上传主要是前端将一个大文件分成若干等份,并识别出当前分片的个数和分片总数。当所有分片上传成功后,就可以在后台合成文件了。.2、开发过程中遇到的问题sharding时每个slice应该分成多少size?如果太大,会出现“413requestentitytoolarge”。上传分片时,没有严格按照分片序号上传。如何判断所有分片都上传成功?合成文件时如何判断并保证合成的是一个完整的文件,没有错误?多个分片同时上传时,当没有文件读写排他锁时,会导致合成错误。3.问题解决出现413时,修改nginx.conf和php.ini(1)在nginx中添加client_max_body_size和client_body_buffer_size(2)在php.ini中添加post_max_size和upload_max_filesize重启nginx和php-fpm代码逻辑整理分享(1)首先获取当前切片的个数和切片总数(2)创建一个文件夹存放所有的切片和合成的文件(3)变量$done初始为true判断是否所有切片的所有片段都上传.保存每个分片时,以分片序号作为文件名,然后判断是否所有的分片文件都存在。(4)当$done===true时,表示所有分片都上传完毕,合成文档。$target变量表示合成文件的名称。file_exists判断是否合成成功,然后通过append的方式创建并打开文件,循环将每个分片的内容写入到一个文件中。在读取每个分片前,先判断当前分片是否存在,以防止多个进程执行合成文件的代码块,导致一个分片被写入和删除,最终导致合成文件不完整。当需要删除合成的不完整文件并退出当前进程时。最好为每个shard设置一个独占锁flock($in,LOCK_EX),保证其他进程在读写shard时不会操作该shard。最后删除片段unlink,释放排他锁。
