• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

КТО ЗНАКОМ С PHP?

s unity

Green Team
18.09.2019
207
25
BIT
0
у меня есть форма загрузки файлов, js и php которые ее обрабатывают. так вот, все хорошо, все заружается. но мне нужно чтобы фотки загружались не в одну папку указанную в переменной $upload_path = __DIR__ . "/upload/"; а в этой папке upload создавал свою новую папку с уникальным именем (не важно каким).
прикладываю код:
это ajax.php
PHP:
header('Content-Type: application/json; charset=utf-8');
$response = array();
$response['status'] = 'bad';

if (!empty($_FILES['file']['tmp_name'])){
    for($key=0;$key<count($_FILES['file']['tmp_name']);$key++){
        $upload_path = __DIR__ . "/upload/";
        $user_filename = $_FILES['file']['name'][$key];
        $userfile_basename = pathinfo($user_filename,PATHINFO_FILENAME );
        $userfile_extension = pathinfo($user_filename, PATHINFO_EXTENSION);
        $server_filename = $userfile_basename . "." . $userfile_extension;
        $server_filepath = $upload_path . $server_filename;
        $i = 0;
        while(file_exists($server_filepath)){
            $i++;
            $server_filepath = $upload_path .  $userfile_basename . "($i)." . $userfile_extension;
        }
        if (copy($_FILES['file']['tmp_name'][$key], $server_filepath)){
            $response['files'][] =  $server_filepath;
            $response['status'] = 'ok';
        }
    }
}
echo json_encode($response);

и JS
JavaScript:
$(document).ready(
                function(e){
                    let form = $('#myform');
                    let message = $('#myform_status');
                    let progressBar = $('#progressbar');
                    form.on('submit',function(){
                        let formData = new FormData();
                        if(($('#myfile')[0].files).length !=0){
                            $.each($('#myfile')[0].files, function(i, file){
                                formData.append("file[" + i + "]", file);
                            });
                        }
                        else{
                            message.text('Нужно выбрать файл/ы');
                            return false;
                        }
                        $.ajax({
                            type:"POST",
                            url:"ajax.php",
                            cache:false,
                            dataType:"json",
                            contentType: false,
                            processData: false,                               
                            data: formData,
                            xhr: function(){
                                let uploadBar = document.getElementById('progressbar_on-off');
                                uploadBar.classList.add('progress-on');
                                let xhr = $.ajaxSettings.xhr(); // получаем объект XMLHttpRequest
                                xhr.upload.addEventListener('progress', function(evt){ // добавляем обработчик события progress (onprogress)
                                  if(evt.lengthComputable) { // если известно количество байт
                                    // высчитываем процент загруженного
                                    let percentComplete = Math.ceil(evt.loaded / evt.total * 100);
                                    // устанавливаем значение в атрибут value тега <progress>
                                    // и это же значение альтернативным текстом для браузеров, не поддерживающих <progress>
                                    progressBar.val(percentComplete);
                                }
                            }, false);
                            return xhr;
                              },
                            beforeSend: function(){
                                console.log('Запрос начат');
                                message.text('Файлы загружаются, подождите...');
                                form.find('input').prop("disabled",true);
                            },
                            success: function(data){
                                console.log('А тут отработать если ок');
                                if(data.status == 'ok'){
                                    $('#myfile').val('');
                                    message.text('Файлы загружены');
                                }
                                else{
                                    message.text('Что-то не так с загрузкой');
                                }
                            },
                            complete: function(data){
                                console.log('Запрос закончен');
                                form.find('input').prop("disabled",false);
                                document.location.href = "/thanks.php";
                            }/*,
                            error: function(xhr, ajaxOptions, thrownError){
                                console.log(thrownError);
                                message.html('Была ошибка');
                            }*/
                        });                       
                        return false;
                    });
                }
            );
 

explorer

Platinum
05.08.2018
1 081
2 469
BIT
14
Примерно так можно сделать:

mkdir($upload_path."/".$user_filename);
То есть создаёте папку с именем файла каждый раз при заливке файла по его имени. Ну и соответственно нужно отредактировать потом путь загрузки

$upload_path = __DIR__ . "/upload/".$user_filename ."/";
 

s unity

Green Team
18.09.2019
207
25
BIT
0
Примерно так можно сделать:

mkdir($upload_path."/".$user_filename);
То есть создаёте папку с именем файла каждый раз при заливке файла по его имени. Ну и соответственно нужно отредактировать потом путь загрузки

$upload_path = __DIR__ . "/upload/".$user_filename ."/";
после проведения тестов, обязательно закрою вопрос

Примерно так можно сделать:

mkdir($upload_path."/".$user_filename);
То есть создаёте папку с именем файла каждый раз при заливке файла по его имени. Ну и соответственно нужно отредактировать потом путь загрузки

$upload_path = __DIR__ . "/upload/".$user_filename ."/";
подскажите пожалуйста где место в коде этих строк. а то переменная появляется раньше ее обозначения. не пойму
 

explorer

Platinum
05.08.2018
1 081
2 469
BIT
14
Можно например переназначить переменную ниже по коду

$upload_path = __DIR__ . "/upload/";
$user_filename = $_FILES['file']['name'][$key];
mkdir($upload_path."/".$user_filename);
$upload_path = __DIR__ . "/upload/".$user_filename ."/";
 

s unity

Green Team
18.09.2019
207
25
BIT
0
Можно например переназначить переменную ниже по коду
это работает. но есть жирное НО. теперь создаются папки для каждого файла в папке upload. допустим я загружаю 3 картинки 1.jpg 2.jpg 3.jpg и в папке upload создаются 3 папки - 1 2 и 3 и в внутри лежат соответствующие файлы.
уже можно вам сказать спасибо, так как я сдвинулся с мертвой точки. но мне нужно чтоб 1 процесс загрузки (5 или 100 файлов) в одну, отдельную папку.
 

BearSec

Platinum
20.04.2020
209
289
BIT
7
это работает. но есть жирное НО. теперь создаются папки для каждого файла в папке upload. допустим я загружаю 3 картинки 1.jpg 2.jpg 3.jpg и в папке upload создаются 3 папки - 1 2 и 3 и в внутри лежат соответствующие файлы.
уже можно вам сказать спасибо, так как я сдвинулся с мертвой точки. но мне нужно чтоб 1 процесс загрузки (5 или 100 файлов) в одну, отдельную папку.
Предположу, что в начале можно генерировать рандомное число, и потом его использовать в качестве папки для загрузки.
PHP:
$upload_path = __DIR__ . "/upload/";
$random_number = mt_rand(100000, 999999);
while (file_exists($upload_path."/".$random_number))
{
    $random_number = mt_rand(100000, 999999);
}
mkdir($upload_path."/".$random_number, 0777, true);
$upload_path = __DIR__ . "/upload/".$random_number ."/";
 

explorer

Platinum
05.08.2018
1 081
2 469
BIT
14
это работает. но есть жирное НО. теперь создаются папки для каждого файла в папке upload. допустим я загружаю 3 картинки 1.jpg 2.jpg 3.jpg и в папке upload создаются 3 папки - 1 2 и 3 и в внутри лежат соответствующие файлы.
уже можно вам сказать спасибо, так как я сдвинулся с мертвой точки. но мне нужно чтоб 1 процесс загрузки (5 или 100 файлов) в одну, отдельную папку.

Вариантов решения можно массу придумать, например назвать папку по дате и времени, тогда имя всегда будет уникальным. Название папки будет в таком формате 2020-08-23-11-20-24

PHP:
$upload_path = __DIR__ . "/upload/";
$user_filename = $_FILES['file']['name'][$key];
$d = date("Y-m-d-H-i-s");
mkdir($upload_path."/".$d);
$upload_path = __DIR__ . "/upload/".$d ."/";
 

s unity

Green Team
18.09.2019
207
25
BIT
0
Вариантов решения можно массу придумать, например назвать папку по дате и времени, тогда имя всегда будет уникальным. Название папки будет в таком формате 2020-08-23-11-20-24

PHP:
$upload_path = __DIR__ . "/upload/";
$user_filename = $_FILES['file']['name'][$key];
$d = date("Y-m-d-H-i-s");
mkdir($upload_path."/".$d);
$upload_path = __DIR__ . "/upload/".$d ."/";
искренне благодарен за помощь! спасибо
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!