我应该使用php序列化吗?
序列化文件大小是否有限制? JPG最高可达10mb。
答案 0 :(得分:1)
除了PHP可用的内存之外,我认为没有任何限制。但是,在会话中存储大文件会导致不必要的延迟,因为会话对象必须在每个请求结束时的非序列化开始时被反序列化(除非在那些您不加载会话的请求中)。
您可以将文件保存在临时位置,并仅在会话中保存文件名。
答案 1 :(得分:1)
您可以将二进制数据存储在会话变量中,因此根本不需要对其进行修改。会话文件已经(或多或少)序列化。
或者,您可以对图像数据进行base64编码以存储在会话数据中。
话虽如此,这似乎是一个坏主意 - 你会在加载会话时添加更多的服务器负载来编码/解码图像数据(如果你还需要对它进行base64解码,你会更多)将整个文件加载到内存中。我会将图像转储到临时文件,并将文件的路径存储在会话数据中。
答案 2 :(得分:0)
只要你没有超过memory_limit,就可以存储它。
那就是说,这是我用来将$_FILES
推入会话的方法,假设:
$_SESSION['File']
是我们存储它的地方$uploadFile
是上传的图片(例如对$_FILES
的引用)
if ($uploadFile['error'] == UPLOAD_ERR_OK)
{
// try reading directly from temp directory
if (is_readable($uploadFile['tmp_name']))
{
$_SESSION['File'] = file_get_contents($uploadFile['tmp_name']);
}
// not readable as-is, make sure we can move it
else
{
$moveTo = 'uploads' . DIRECTORY_SEPARATOR . $uploadFile['name'];
if (is_writeable(dirname($moveTo)) && move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false)
{
// read now that its been moved
$_SESSION['File'] = file_get_contents($moveTo);
// cleanup
@unlink($moveTo);
}
}
}
否则,如果所有其他方法都失败,则无法将其存储在会话中
答案 3 :(得分:-1)
PHP会话受PHP内存使用限制的限制。所以10mb可能还可以,但是......
我不认为“session”是存储大型二进制数据的正确选择。上传的文件将转到服务器上的临时文件夹,您可以从该目录访问它们一段时间。因此,如果您以后需要访问该文件,则只需将临时文件路径存储到会话中即可。
示例代码:
session_start();
$_SESSION["uploaded_file"] = $_FILES["file"];
然后,当您需要将该文件复制到真实路径时,您可以执行以下操作:
move_uploaded_file($_SESSION["uploaded_file"]["tmp_name"], "images/".$_SESSION["uploaded_file"]["name"]);
如果需要,您还可以从$ _SESSION [“uploaded_file”]中获取“type”,“size”和“error”项目。