【问题标题】:Managing php sessions on multiple file uploads管理多个文件上传的 php 会话
【发布时间】:2013-09-27 00:50:10
【问题描述】:

我正在使用多张图片上传社交网络应用程序。我将$_session['file_id'] 分配给每个上传的文件作为数组索引(文件ID 来自db)。但我只希望用户每篇文章最多上传 4 张图片。所以我在上传前计算images.length,如果是== 4,提醒用户不能同时上传更多文件,否则正常上传。出于安全目的,我有一个unset($_session['file_id']),以确保不会在错误或用户更改javascript时上传4个文件(每次上传时都有一个for循环,以计算$_session['file_id'])。 我遇到的问题是 js 本身不足以确保文件没有上传 4 次,我猜 ajax 上传留在队列中,并在第 4 个文件上传之前检查文件号。有没有其他方法可以直接在php上使用,记住我不能为普通用户取消设置文件(4个文件已经上传并等待发送按钮),但是如果用户刷新或退出页面,我需要加上取消设置文件?感谢您的宝贵时间。

JavaScript

var checkfilecount = 0;
$('#file').change(function() {
    checkfilecount++;
    checkfile = $("#images).length;
    if (checkfile < 4 && checkfilecount < 4) {
        $("#filesend").submit();
    }
    else {
        setTimeout(function(){
            alert("Sorry, You can`t upload too many files at once")
        },3000)
    }
})  

在#postsend 上:

checkfilecount = 0;

PHP

if (isset($_SESSION['files_id'])) {
    $counting = 0; 
    foreach($_SESSION['files_id'] as $key => $val)
    {
        $counting++;
        if ($counting == 4) {
            unset($_SESSION['files_id']);       
            exit("error on session array"); 
        }   
    }   
}

【问题讨论】:

  • 编辑您的帖子并添加代码。
  • 第 4 行:checkfile = $("#images).length;$('#images) 的末尾漏掉了一个",它必须是$("#images")

标签: php session file-upload


【解决方案1】:

例如为&lt;input&gt;s 分配一个随机类名:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file[]" class="fileuploadCounter">
    <input type="file" name="file[]" class="fileuploadCounter">
    <input type="file" name="file[]" class="fileuploadCounter">
    <input type="file" name="file[]" class="fileuploadCounter">
</form>

在初始化之后,$('.fileuploadCounter').length() 将返回该类的元素数量,在本例中为四个。请参阅jQuery documentation


下面的旧答案

&lt;input&gt;标签上的名字改成images[],算上$_POST['images']服务器端。

例如:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file[]">
    <input type="file" name="file[]">
    <input type="file" name="file[]">
    <input type="file" name="file[]">
</form>

<?php
    if($_SERVER['REQUEST_METHOD'] == "POST"){
        if(isset($_FILES['file'])){

            // Because we added [] in the name tag and they match names, $_FILES['file'] is now an array containing the images. 

            if(count($_FILES['file']) > 4){

                // More than 4 files

            }
            else
            {

                // Less then four!

                foreach($_FILES['file'] as $file){
                    move_uploaded_file($file["file"]["tmp_name"], "uploads/" . $files["file"]["name"]);
                }
            }
        }
    }
?>

【讨论】:

  • 谢谢@Thew,但这不是问题所在。我需要的是一种计算imgs的客户端方式,如果它们少于4个,只发送到php,我在我的代码中尝试了2种方式,但没有一种有效。另外,我需要一种方法来检查用户是否退出页面并重新启动上传(如果我不会取消设置会话数组,那么即使刷新页面,用户也会收到限制消息,但是如果我在没有前端检查的情况下取消设置,用户将丢失他上传的文件)你能帮帮我吗?谢谢
  • 如果您在没有 PHP 端的情况下检查,Javascript 计数图像是不安全的。任何用户都可以根据需要编辑您的代码并发送一千张图片。
  • 我知道,如果它到达 php 端的 5 文件,我的方法是取消设置,但前提是用户通过 js 限制(如果用户修改 js)。
  • 在我的代码中,我只有一个文件输入,但我使用相同的方法,但使用上传的图像类和文件计数变量。问题是提交有时发生在文件计数或 file.length 发生之前。可能是ajax异步的原因。
  • 编辑:我在提交每张图片之后都放了 count++(我在提交之前使用它,考虑异步,但不会工作)并且它有效,猜它会有一些问题,但我明白了它。谢谢@Thew。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 2016-03-23
  • 2011-04-29
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多