как загрузить файл на сервер с url-а
я умею загружать на сервер файлы при помощи поля [COLOR="DarkGreen"]input file[/COLOR],
но мне нужно еще реализовать загруску с урлы.
пример того что нужно реализовать
Вообще можно это сделать так:
1) через system('wget ...');
2) http://www.php.net/manual/en/function.file-get-contents.php
3) http://www.php.net/manual/en/function.file.php
4) ...
но может возникнуть необходимость в копировании файлов другого типа.
первый, предложеный вариант немножко непонял.
со вторым и третим помойму проще уж так
...
if (!copy($_POST['url_file'], $file_name)){
echo "Не удается копировать файл. Попробуйте еще раз.";
} else {
copy($_POST['url_file'], $file_name);
echo "Копирование успешно завершено";
}
и остается еще одна проблема
а как мне определить тип файла скачиваемого с url,
мне же не все подряд нужно
$TITLE = "Загрузка файла";
if ((@!isset($_GET['up'])) && (@$_GET['up'] != 'true')){
include("_head.php");
?>
<form enctype="multipart/form-data" action="upload_img.php?up=true" method="post">
<div style="padding:2px;font-size:8pt;">Загрузить с компьютера: <input type="text" name="url_file" style="width:200px" value="http://"></div>
<div style="padding:2px;font-size:8pt">Загрузить из интернета: <input type="file" name="userfile" style="margin-left:4px;width:206px"></div>
<input type="submit" value="Загрузить" class="button" style="width:100px;margin-left:136px">
<input type="button" value="Отмена" class="button" style="width:100px;margin-left:2px" onClick="java script:window.close();"></form>
<?php
} else {
$errorType = "";
$error = 1;
if (@!file_exists($_POST['url_file'])){
$i = 1;
// необходимо узнать расширение
// и провести проверку
$TPM_NAME = $_POST['url_file'];
} elseif (@!$_POST['userfile']){
$SIZE = @$_FILES['userfile']['size'];
$NAME = @$_FILES['userfile']['name'];
$TYPE = @$_FILES['userfile']['type'];
$TPM_NAME = @$_FILES['userfile']['tmp_name'];
// ограничение на загрузу
if (!strstr($TYPE, "image")){
$errorType = "К загрузке будут допущены только файлы типа - \"image\"";
$error++;
}
if ($SIZE > 3145728){
$errorType = "К загрузке будут допущены файлы объемом не более 3 Mb";
$error++;
}
}
if ($error > 1){
include("_head.php");
?>
<form enctype="multipart/form-data" action="upload_img.php?up=true" method="post">
<?=$errorType?>
<div style="padding:2px;font-size:8pt">Загрузить с компьютера: <input type="text" name="url_file" style="width:200px" value="http://"></div>
<div style="padding:2px;font-size:8pt">Загрузить из интернета: <input type="file" name="userfile" style="margin-left:4px;width:206px"></div>
<input type="submit" value="Загрузить" class="button" style="width:100px;margin-left:136px">
<input type="button" value="Отмена" class="button" style="width:100px;margin-left:2px" onClick="java script:window.close();"></form>
<?php
} elseif (copy($TPM_NAME)){
$bodyProperty = " onLoad=\"java script:setTimeout('window.location='upload_img.php';',4000);";
include("_head.php");
?>
Не удается копировать файл. Попробуйте еще раз.
<?php
} else {
// узнаем раcширение
// работает только в input file
$i = 1;
$type_file_save = substr($NAME, -$i);
while(!strstr($type_file_save, '.')){
$type_file_save = substr($NAME, -$i);
++$i;
}
// искуственно задаю расширение
$type_file_save = '.png';
// создаем новое имя
$file = md5(uniqid(rand(),1));
$file_name = "../../upload/image/".$file.$type_file_save;
while(file_exists($file_name) != false){
$file = md5(uniqid(rand(),1));
$file_name = "../../upload/image/".$file.$type_file_save;
}
copy($TPM_NAME, $file_name);
$bodyProperty = " onLoad=\"closeWinUpload('http://".$_SERVER['HTTP_HOST']."/upload/image/".$file.$type_file_save."')\"";
include("_head.php");
?>
<script language="JavaScript">
function closeWinUpload(put){
window.opener.document.all.fullDescription.value += '';
window.close();
}
</script>
<br>
<input type=text value="[img=http://<?=$_SERVER['HTTP_HOST']?>/upload/image/<?=$file?><?=$type_file_save?>]" style="width:280px">
<?php
}
}
?>
</body>
</html>
код сыро, прошу не придераться
мне нужен headers, но ксожалению я в мануале нашел только определение у локального файла, а не файла с url.
может я плхо искал?:D
Можешь расширения проверять, но его конечно же можна моменять. Можешь перед загрузкой жабаскриптом поизвращаться - тоже вариант. А можешь и после загрузки средствами РНР, юзая [COLOR=blue]$_FILES['переменная']['type'][/COLOR]. Например
{
echo "файл не указан или не является файлом MsWord!";
}
но имхо разные броузеры по-разному МИМЕ-типы отдают, да и изменить в файле описаний мимов можно (можно вместо того же екселя бинарник прописать). Для точной уверенности можно проверять заголовки форматов загружаемых файлов и сверять, не подходят ли они требуемым файлам.
какраз это я и зделал
можно еще воттак подправить код
и защита чуть лучше
и более читабельный
$error = 1;
$i = 1;
if (!file_exists($_POST['url_file'])){
$SIZE = ''; // необходимо узнать размер
$NAME = $_POST['url_file'];
$TYPE = ''; // необходимо узнать MIMI-тип
$TPM_NAME = $_POST['url_file'];
} elseif (@!$_POST['userfile']){
$SIZE = @$_FILES['userfile']['size'];
$NAME = @$_FILES['userfile']['name'];
$TYPE = @$_FILES['userfile']['type'];
$TPM_NAME = @$_FILES['userfile']['tmp_name'];
}
// узнаем рашширение
$type_file_save = substr($NAME, -$i);
while(!strstr($type_file_save, '.')){
$type_file_save = substr($NAME, -$i);
++$i;
}
// проверка - сравнение MIMI-типа и расширения файла
if (($TYPE == "image/jpeg") && ($type_file_save == '.jpg')){
} elseif (($TYPE == "image/gif") && ($type_file_save == '.gif')){
} elseif (($TYPE == "image/x-ms-bmp") && ($type_file_save == '.bmp')){
} elseif (($TYPE == "image/x-png") && ($type_file_save == '.png')){
} else {
$errorType = "К загрузке будут допущены только файлы типа - \"image\"";
$error++;
}
if ($SIZE > 3145728){
$errorType = "К загрузке будут допущены файлы объемом не более 3 Mb";
$error++;
}
но опять же - как мне определить размер и тип файла загружаемого через url???
немогу понять о чем ты говоришь? :confused:
Мануально проверять стандартный формат файла, например для ЕХЕ:
Offset Size Description
-------------------------------------------------------------------
00 | word | "MZ" - Link file .EXE signature
02 | word | length of image mod 512
04 | word | size of file in 512 byte pages
06 | word | number of relocation items following header
-------------------------------------------------------------------
Я даж класс в нете видел на РНР для работы с ЕХЕшниками...
Так уж точно узнаешь о правильности формата :).
Имхо, чуть извращенный :) , но вариант ))
что так сложно было кинуть ссылку на ман. headers
$url = 'http://www.example.com';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>
(
[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html
)
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html
)
я тут ... веду половую жизнь со своим мозгом ... пытаясь выяснить как мне узнать свойства загружаемого файла из url???
а оказывается все решается на раз плюнуть
еперный карась. убейте меня кто ни будь
я тут ... веду половую жизнь со своим мозгом ...
еперный карась. убейте меня кто ни будь
По таким вопросам - к модераторам или администратору)) Убъют легко))
Да, кстати, я модератор. Какой вопрос?
совершенно точно
замеченные mime-типы картинок:
image/pjpeg (иногда отдает IE вместо image/jpeg)
image/jpeg
image/jpg
image/gif
image/x-ms-bmp
image/bmp
image/x-png (иногда отдает IE вместо image/png)
image/png
PS хорошо хоть gif всегда одинаковый :)
на такой случай существует сея конструкция
echo "Несоответствует на бинарном уровне";
}