Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Форма для загрузки файла по ссылке (https://javascript.ru/forum/misc/72601-forma-dlya-zagruzki-fajjla-po-ssylke.html)

Nexus 16.02.2018 15:37

Цитата:

Сообщение от kupidon
Также я загружаю фото из карточки УЖЕ созданного товара, а следовательно не надо проверять есть он в БД или нет. Он есть 100%.

Загрузка изображений со страницы редактирования товара отнюдь не говорит о том, что товар абсолютно точно существует.
Всякое бывает, к примеру: 2 пользователя зашли в админку единовременно, первый пошел фоточки товару заливать, второй в это время его (товар) по какой-то причине удалил.

laimas 16.02.2018 15:42

Nexus,
главное, забывают о том, что загружать могут и левое. )

Nexus 16.02.2018 15:46

laimas, при разработке доверять вообще ничему нельзя, тем более внешним данным )

laimas 16.02.2018 15:51

Цитата:

Сообщение от Nexus
при разработке доверять вообще ничему нельзя, тем более внешним данным

Вот этого к сожалению и не понимают.

kupidon 17.02.2018 19:46

Вчера победил загрузку и файлы начались сохраняться ко мне на сервак.
Но сделал немного по другому, не как вы мне предлагали..
И все же, чтобы подвести итог нашей дискуссии, заккомментировал пока мой рабочий код, поскольку уважаю ваши советы и
хочу попробовать сделать с вашим кодом. НО поскольку для меня это темный лес, и все функции для меня новые.
Итак, вот что я вставил в обработчик:
if (!empty($_POST['file_url'])){
	$mime = array('image/png', 'image/jpeg'); //переделал строку с вашим кодом, а то он ругался на кв ковычки
	$size = 1000000; //макс. размер.

	function processingIMG($f) {
	    if(!$im = @imagecreatefromstring($f)) return 1; //файл не является изображением
	    //далее операции
	    //сохранение
	    return 0; 
	}

	if($url = array_diff(filter_var_array($_POST['file_url'], FILTER_VALIDATE_URL), [false]))   	{
	    foreach($url as $a) {
	        $hdr = get_headers($a, 1);
	        if(strpos($hdr[0], '200')) {
	            if(in_array($hdr['Content-Type'], $mime) && $hdr['Content-Length'] <= $size) 				$upl[] = $a;    
	        }
	    }
    
    	foreach($upl as $url) {
        	if($f = @file_get_contents($url)) {
            	if(processingIMG($f)) echo 'Error';    
        	}
    	}
	}
}


Вот что приходит в ответ:
Выдает ошибку.
<!--error--><br />
<b>Parse error</b>: syntax error, unexpected '[' in <b>adm\include\upload_photo\ajax_upload.php</b> on line <b>97</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script>

97 строка это:
if($url = array_diff(filter_var_array($_POST['file_url'], FILTER_VALIDATE_URL), [false]))


Эти функции для меня новые и без совета мне не обойтись

Nexus 17.02.2018 20:28

kupidon, "[false]" замените на "array(false)".
У вас, вероятно, версия php меньше 5.4 поэтому при объявлении массива через квадратные скобки сыпятся ошибки.

Upd. У вас $_POST['file_url'] - массив?

kupidon 17.02.2018 20:36

Да, у меня денвер. Тестирую на компе.

<!--error--><br />
<b>Warning</b>: filter_var_array() expects parameter 1 to be array, string given in <b>Z:\home\19sp.ru\www\forum\mysp\adm\include\uplo ad_photo\ajax_upload.php</b> on line <b>156</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script><!--error--><br />
<b>Warning</b>: array_diff() [<a href='function.array-diff'>function.array-diff</a>]: Argument #1 is not an array in <b>Z:\home\19sp.ru\www\forum\mysp\adm\include\uplo ad_photo\ajax_upload.php</b> on line <b>156</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script>

В этой же строке:
if($url = array_diff(filter_var_array($_POST['file_url'], FILTER_VALIDATE_URL), array(false)))

kupidon 17.02.2018 20:37

Цитата:

Сообщение от Nexus
Upd. У вас $_POST['file_url'] - массив?

нет , это одиночная ссылка

Nexus 17.02.2018 20:41

kupidon, вы если английский не знаете, то переведите текст ошибки с помощью какого-нибудь переводчика, это значительно упростит дебаг.
Текст ошибки - не какое-либо заклинание, а вполне ясное описание возникшей ошибки.

Функция "filter_var_array" принимает в ка-че первого аргумента массив, вы передали строку, отсюда и ошибка.
Оберните $_POST['file_url'] в массив, либо воспользуйтесь функцией "filter_var".

Цитата:

Сообщение от kupidon
Да, у меня денвер. Тестирую на компе.

У меня тоже стоит денвер, но версия 7.1 ;)

kupidon 17.02.2018 21:05

Спасибо Вам. Обернул в массив, заработало.

Файл на стороннем сервере я проанализировал. Если условия удовлетворены (размеры и тип), теперь сохраняю его в СВОЮ временную папку, для обработки.

У меня есть два варианта сохранения:
1. С помощью fopen и fwrite
if (file_get_contents($_POST['file_url']))
{
	$content = file_get_contents($_POST['file_url']);
	$f = fopen( "../../../photos/temp/temp.jpg", "w" );
	if (fwrite( $f, $content ) === FALSE)
	{
		echo "Не могу произвести запись в файл.";
		exit;
	}
	else {
		$filesize = filesize_get($file); 
		echo " Файл <font color='red'>" .$file ."</font> записан.".$filesize;
		fclose( $f );
	}
}
else echo "Не могу качать файл.";


2.
$file = 'https://www.google.ru/images/srpr/logo11w.png';
$file_name = basename('https://www.google.ru/images/srpr/logo11w.png');
file_put_contents('my_folder'.$file_name, file_get_contents($file));



какой мне выбрать?


Часовой пояс GMT +3, время: 19:02.