Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 05.06.2021
Сообщений: 23
1

Файл для скачивания

18.08.2021, 01:57. Показов 1056. Ответов 5

Author24 — интернет-сервис помощи студентам
Посоветуйте литературу для чтения. Нужно сделать форму для того чтобы можно было загрузить файл для скачивания (к примеру сайт с песнями для скачивания). Язык: PHP Так же приветствую исходники. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2021, 01:57
Ответы с готовыми решениями:

Файл для скачивания
Нужно записать текст в файл, при этом файл не создавать а предложить пользователю его скачать. ...

Отдать динамически генерируемый txt файл для скачивания
Здравствуйте, как отдать на скачивание txt файл? файла на сервере нет, текст файла должен...

Как защитить файл от скачивания сторонним скриптом?
Есть скрипт который отправляет файл пользователя на сервер (картинку), рисует что-то на ней и...

Как через VBS скрипт скачать файл с яндекс диска, если файл открыт для скачивания?
Как с помощью VBS скрипта скачать файл с яндекс диска, если файл открыт для скачивания?

5
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
21.08.2021, 00:52 2
Вот
https://www.cyberforum.ru/post15626974.html

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    <p><font size="5" color="red" face="Arial">Загрузка файла на сервер</font></p>
    <form action="api.php" method="POST" Success="ResultLoad" Error="ResultLoadError">
        <input type="hidden" name="method_call" value="LoadFile"/>
        
        <p>Выберите файл</p>
        <input name="myFile[]" type="file" multiple>
 
        
        <textarea id="Mytextarea">
          Данные файла
        </textarea>
 
        <br>
        <button type="submit" class="button default">
            Отправить
        </button>
    </form>
    
    <script>
        function ResultLoad(data, this_jquery) {
            // Сбросим данные формы
            this_jquery.trigger("reset");
            
            // Выведем ответ
            $('#Mytextarea').val(data['message']);
        }
        function ResultLoadError(error, this_jquery) {
            alert(error.responseText);
        }
    </script>
Проще реализации не найдёшь
0
Невнимательный
2680 / 1100 / 343
Регистрация: 08.02.2013
Сообщений: 6,266
Записей в блоге: 2
21.08.2021, 09:58 3
Цитата Сообщение от OpXiv Посмотреть сообщение
Вот
есть небольшой минус если случайно в дирректории куда грузятся файлы будет разрешено выполнение php
... проверки выполняются только по MIME-type не по расширению файла.

Пробовал без js вызывать такой обработчик
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<?php
# файл в utf-8 переносы CRLF
 
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// > Задаём ответ в виде json
 
if ($_SERVER['REQUEST_METHOD'] !== 'POST'){
    header('content-type: text/html; charset=utf-8');
?>
    <dt>js не интересует интересует обработчмк</dt>
    <dd><a href="?test">Нажать чтобы проверить напрямую</a></dd>
    
    <form action="api.php" method="POST" Success="ResultLoad" Error="ResultLoadError">
        <input type="hidden" name="method_call" value="LoadFile"/>
        
        <p>Выберите файл</p>
        <input name="myFile[]" type="file" multiple>
 
        
        <textarea id="Mytextarea">
          Данные файла
        </textarea>
 
        <br>
        <button type="submit" class="button default">
            Отправить
        </button>
    </form>
    
<?php
    if (isset($_GET['test'])){
        $opts = array('http' =>
            array(
                'method'  => 'POST',
                'content' => <<<'TXT'
-----------------------------7e598342a05ec
Content-Disposition: form-data; name="method_call"
 
LoadFile
-----------------------------7e598342a05ec
Content-Disposition: form-data; name="Mytextarea"
 
File Data.
Any text.
-----------------------------7e598342a05ec
Content-Disposition: form-data; name="myFile"; filename="..\st\test.gif.php"
Content-Type: image/gif
 
<?php
 phpinfo();
 
-----------------------------7e598342a05ec--
 
TXT,
                'header'  => ['Content-Type: multipart/form-data; '.
                    ' boundary=---------------------------7e598342a05ec', 
                    'Content-Length: 445'
                ],
 
            )
        );
        $context = stream_context_create($opts);
        $result = file_get_contents('http://localhost'.$_SERVER['REQUEST_URI'], false, $context);
        echo '<pre>'. strtr(var_export(json_decode($result), 1), ['<'=>'&lt;']).'</pre>';
    }
    exit;
} // end if !POST
 
 
header('Content-Type: application/json; charset=utf-8');
 
//include_once "api_functions.php";
function returnOut(array $result) {
    echo json_encode($result + ['test'=>'$_FILES='.var_export($_FILES, 1)
        ."\n\$_POST=".var_export($_POST, 1)],  1); 
    exit; // Выходим из работы скрипта.
};
// Функция загрузки файлов на сервер
function LoadFilesFromDir($dirLoad, &$SuccessfulLoading, &$IsErrorLoad, $ext = '') {
    if(!empty($ext))
        $ext = explode('|', $ext);
    // Если папки не существует, создадим её
    if(!is_dir($dirLoad)) {
        if (!mkdir($dirLoad, 0777, true)) {
            return true;
        }
    }
        
    // Обработаем переданные файлы на сервер
    $SuccessfulLoading = [];
    $IsErrorLoad = [];
    
    $callbackLoad = function($key, $name, $tmp_name, $type) 
                        use ($dirLoad, &$SuccessfulLoading, &$IsErrorLoad, $ext) {
        $Load = false;  
        if(is_array($ext)) {
            foreach($ext as $v) {
                if(stripos($type, $v) !== false) {
                    $Load = true;   
                    break;
                }
            }
        } else {
            $Load = true;       
        }
        
        if($Load) {
            // Зададим указанный путь, с именем файла
            $LoadToDir = $dirLoad . '/' . $name;
            
            // Перенесём файл в нашу указанную папку
            $ret = ['tmp_name' => $tmp_name, 'path' => $LoadToDir,  'type' => $type];
            if(!move_uploaded_file($tmp_name, $LoadToDir))
                $IsErrorLoad[$key] = $ret;
            else
                $SuccessfulLoading[$key] = $ret;
        }
    };
    
    foreach($_FILES as $key => $file) {
        if(is_array($file['name'])) {
            // Похоже, нужно обработать сколько файлов (multiple)
            foreach($file['name'] as $index => $name) {
                $callbackLoad($key, $name, $file['tmp_name'][$index], $file['type'][$index]);
            }
        } else {
            // Обаработаем без multiple
            $callbackLoad($key, $file['name'], $file['tmp_name'], $file['type']);
        }
    }
    return count($SuccessfulLoading) <= 0 && count($IsErrorLoad) >= 0;
} // end LoadFilesFromDir()
 
 
// Функция быстрой проверки аргументов
// $name      > Имя ключа в $_REQUEST
// $ErrorText > Еси нужен кастомтный текст ошибки
// $default   > Нужен ли аргумент по умолчанию? Если нет ключа
// $value     > Если нужен, то задаём значение
// $callBack($name, $ErrorText) > Кастомный обработчик
function ParsArgsResult($name, $ErrorText = false, $default = false, $value = false, $callBack = false) {
    $Result = NULL;
    if(empty($_REQUEST[$name])) { // Если пустой ключ, или его нет
        if($default) {
            $Result = $value; // Задаём значение по умолчанию
        } else {
            $ErrorText = ($ErrorText ? $ErrorText : "Ключ '{$name}' не задан.");
            if($callBack && is_callable($callBack)) {
                $callBackResult = $callBack($name, $ErrorText);
                if($callBackResult) {
                    return $callBackResult;
                }
            } else {
                returnOut([
                    'error' => true,
                    'message' => $ErrorText
                ]);
            }
        }
    } else { // Получим значение ключа
        $Result = $_REQUEST[$name];
    }
    return $Result;
} // end ParsArgsResult()
 
 
// Код 
switch(ParsArgsResult('method_call', 'Метод не найден.')) {
    case 'LoadFile':
        // Указываем путь загрузки
        if(LoadFilesFromDir('Loader', $SuccessfulLoading, $IsErrorLoad, 'gif|png|jpg')) {
            returnOut([
                'error' => true,
                'message' => 'Возвращено true...'
            ]);
        }
        
        // Сформируем ответ
        $message = '';
        
        // По умолчанию, не будет формировать вывод успешных
        if(count($SuccessfulLoading) > 0) {
            $message .= 'Удачно загрузись: ' . count($SuccessfulLoading) . PHP_EOL;
            $message .= '-----------------------------'. PHP_EOL;
            $message .= print_r($SuccessfulLoading, true);
            $message .= '-----------------------------'. PHP_EOL;
        }
        
        // По умолчанию, не будет формировать вывод ошибок
        if(count($IsErrorLoad) > 0) {
            $message .= 'Ошибка загрузки: ' . count($IsErrorLoad) . PHP_EOL;
            $message .= '-----------------------------'. PHP_EOL;
            $message .= print_r($IsErrorLoad, true);
            $message .= '-----------------------------'. PHP_EOL;
        }
        
        $message .= PHP_EOL;
        
    
        // По умолчанию, не будет формировать вывод успешных
        if(count($SuccessfulLoading) > 0) {
            $message .= '-----------------------------'. PHP_EOL;
            $message .= 'Содержимое файлов: ' . PHP_EOL;
            $message .= '-----------------------------'. PHP_EOL;
            
            // Прочитаем содержимое загруженных файлов
            // И отдадим пользователю в ответе
            foreach($SuccessfulLoading as $file) {
                $message .= '-----------------------------'. PHP_EOL;
                $message .= '-> ' . $file['path'] . PHP_EOL;
                $message .= '-----------------------------'. PHP_EOL;
                $message .= file_get_contents($file['path']) . PHP_EOL;
                $message .= '-----------------------------'. PHP_EOL;   
                $message .= PHP_EOL;
                
                // Удалим загруженный файл от греха по дальше
//                unlink($file['path']);
            }
        }
 
        returnOut([
            'error' => false,
            'message' => print_r($message, true),
        ]); 
    break;
    default:
        returnOut([
            'error' => true,
            'message' => 'Метод не найден.'
        ]);
} // end switch
Но интересно что, несмотря на то что пишут
https://www.php.net/ru/feature... ost-method
PHP
1
2
3
        // basename() может спасти от атак на файловую систему;
        // может понадобиться дополнительная проверка/очистка имени файла
        $name = basename($_FILES["pictures"]["name"][$key]);
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Содержимое файлов: 
-----------------------------
-----------------------------
-> Loader/test.gif.php
-----------------------------
<?php
 phpinfo();
 
-----------------------------
 
',
   'test' => '$_FILES=array (
  \'myFile\' => 
  array (
    \'name\' => \'test.gif.php\',
    \'type\' => \'image/gif\',
    \'tmp_name\' => \'C:\\\\Users\\\\zzz\\\\AppData\\\\Local\\\\Temp\\\\phpFB0F.tmp\',
    \'error\' => 0,
    \'size\' => 20,
  ),
)
$_POST=array (
  \'method_call\' => \'LoadFile\',
  \'Mytextarea\' => \'File Data.
Any text.\',
)',
и без basename $_FILES[...]["name"] очищает ... проверял в PHP-7.4 и PHP-8
Подшаманили видимо.
Ато хотел ещё нагнать жути ))

Добавлено через 2 минуты
Цитата Сообщение от x_lab Посмотреть сообщение
PHP
1
2
3
4
Content-Disposition: form-data; name="method_call"
 
 LoadFile
-----------------------------7e598342a05ec
Подсветка форума добавляет пробелы в пустые строки

... Все пустые строки должны быть пустые.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
21.08.2021, 18:39 4
Цитата Сообщение от x_lab Посмотреть сообщение
... проверки выполняются только по MIME-type не по расширению файла.
В моём коде нет проблем, так как последний параметр
PHP
1
function LoadFilesFromDir($dirLoad, &$SuccessfulLoading, &$IsErrorLoad, $ext = '') {
Проверяет тип, который вернула функция, как раз таки MIME-type
PHP
1
move_uploaded_file($tmp_name, $LoadToDir)
Добавлено через 5 минут
Вообще подделать MIME-type не составляет труда. К примеру возьмём крупную соц сесть ВКонтакте.

Мы запросто можешь вместо статичных картинок загружать Гифки итак далее.

Добавлено через 6 минут
Цитата Сообщение от OpXiv Посмотреть сообщение
Вообще подделать MIME-type не составляет труда. К примеру возьмём крупную соц сесть ВКонтакте.

https://sun9-2.userapi.com/c93... 3aacb0.jpg

У нас jpg а грузиться гифка
0
Невнимательный
2680 / 1100 / 343
Регистрация: 08.02.2013
Сообщений: 6,266
Записей в блоге: 2
22.08.2021, 00:00 5
Цитата Сообщение от OpXiv Посмотреть сообщение
последний параметр
его я и использовал ... но php-файл загрузился
Цитата Сообщение от x_lab Посмотреть сообщение
PHP
173
        if(LoadFilesFromDir('Loader', $SuccessfulLoading, $IsErrorLoad, 'gif|png|jpg')) {
хотя я ещё закомментировал
Цитата Сообщение от x_lab Посмотреть сообщение
PHP
218
219
                // Удалим загруженный файл от греха по дальше
//                unlink($file['path']);
Как-бы чтобы не просто выводить а загружать.
И в конце функции LoadFilesFromDir
я просто не понял как должно работать
и поменял знак второго сравнения
PHP
1
 return count($SuccessfulLoading) <= 0 && count($IsErrorLoad) >= 0;
оно вроде должно возвращать true в случае ошибок но как-то всё-равно не осиливаю ,) хотя файл сохраняется до этого момента
Например всё по нулям ... true
Одно из двух 0... уже как-бы непонятно
Отрицательных count() вроде-же не бывает ,) бывают warning в php7 и fatal в php8
подумал что наличие хоть какой ошибки и отсутствие не-ошибок это возможно повод вернуть true
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
22.08.2021, 11:30 6
Цитата Сообщение от x_lab Посмотреть сообщение
его я и использовал ... но php-файл загрузился
https://ru.wikipedia.org/wiki/... 0%BE%D0%B2

PHP
1
 if(LoadFilesFromDir('Loader', $SuccessfulLoading, $IsErrorLoad, 'image|video|audio')) {
Цитата Сообщение от x_lab Посмотреть сообщение
как-то всё-равно не осиливаю
PHP
1
2
3
4
5
6
7
8
9
10
11
$Result = LoadFilesFromDir($_SERVER['DOCUMENT_ROOT'] . '/images/dir/',
                                            $SuccessfulLoading, $IsErrorLoad,  'image');
if($Result || count($IsErrorLoad)) {
    returnOut([
        'error' => true,
        'message' => 'Ошибка при загрузки изображения.'
    ]);
} else {
    if(isset($SuccessfulLoading['image1']))
        $imagePath = $SuccessfulLoading['image1']['path'];
}
Добавлено через 3 минуты
Цитата Сообщение от x_lab Посмотреть сообщение
и поменял знак второго сравнения
Никто не сказал что не может быть одновременно загружены удачные, и неудачные. По этому мы не можем выдавать блок if с неудачей в постоянном обороте, если нужно обработать такие действия.
0
22.08.2021, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2021, 11:30
Помогаю со студенческими работами здесь

Разместить файл для скачивания
Я хочу разместить на моем сайте файл. Проблема в том, что я не знаю как зделать так, чтоб при...

выложить файл для скачивания
мне нужно чтобы при нажатии на ссылку скачивался определенный файл , к примеру у меня на сервере...

Где разместить файл для скачивания?
Здравствуйте. Появилась необходимость разместить один файл где-нибудь в Интернете. Подскажите,...

Сформировать и отправить для скачивания текстовый файл
Доброго времени суток. Ситуация такая: Есть самописный веб-сервер на .Net без asp.net. Сервер...

BAT-файл для скачивания нескольких файлов с FTP-сервера
Help. Помогите с батником пожалуйста. С FTP сервера необходимо скачивать несколько файлов...

Как запустить файл после скачивания?
А если я не знаю точный адресс, знаю только название файла и куда этот файл будет скачан(В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru