Ъплоуд - странен проблем?!

sizif

Registered
Здравейте!
Честито Рождество Христово и весело посрещане на Новата година!

През последните дни се занимавам с кодове за ъплоуд и след като не можах да си избера (оказа се, че темата не е толкова бедна) се върнах към следния скрипт. Използвал съм го преди, с класове е, няма рисайз, но пък имам идея как да го накарам да обработва неопределен брой заявки.
ПРОБЛЕМЪТ е, че на платения ми хост дава грешка, докато на фрий-хоста ми работи безпроблемно. СТРАННОТО е, че причината за грешката (и съобщението) подозрително се повтаря и при други кодове за ъплоуд и рисайз.

Ето класа, файл Upload.php

<?
class Upload
{
// Име на файла
var $name;
// MIME тип на файла
var $type;
// Големина на файла в Bytes
var $size;
// Резултат, като начало false
var $ok = false;
// Място, където желаете да копирате файла
var $direrctory;

// Конструктор на класа
// Определяне на мястото, където желаете да копирате файла
function Upload($path)
{
$this->directory = $path;
}

function LoadImage($file)
{
// променливата $this->name приема името на файла
$this->name = $_FILES['file']['name'];
// променливата $this->type приема MIME типа на файла
$this->type = $_FILES['file']['type'];
// променливата $this->size приема големината на файла в Bytes
$this->size = $_FILES['file']['size'];

// Проверка, дали файлът съдържа едно от разширенията
if(eregi("(jpg|gif|txt|csv|html)$", $this->name))
{
if(($this->size < 100000) && ($this->size!=0))
{
// Копиране на файла в избраната от Вас директория
copy($file,$this->directory . $this->name);
// променливата $this->ok приема стойност true
$this->ok = true;
}
else
{
// променливата $this->ok приема стойност false
$this->ok = false;
}
}
else
{
// променливата $this->ok приема стойност false
$this->ok = false;
}

// връщане на променливата $this->ok
return $this->ok;

}

// Дава името на файла
function get_name()
{
return $this->name;
}
// Дава типа на файла
function get_type()
{
return $this->type;
}
// Дава големината на файла
function get_size()
{
return $this->size;
}

}

?>


А ето и втория файл, в който се извиква класа, тук е и формата за ъплоуд:

<?
if(is_uploaded_file($HTTP_POST_FILES['file']['tmp_name']))
{
require('Upload.php');
$up = new Upload("images/");
$up->LoadImage($file);

echo $up->get_name() . "<br>";
echo $up->get_type() . "<br>";
echo $up->get_size() . "<br>";
}
?>
<form name="form" enctype="multipart/form-data" method="post" action="">
<input type="file" name="file"><input name="Send" type="submit" value="Upload">
</form>


След опит за качване на файл, парсерът изписва следното предупреждение:

Warning: copy(pic/0001.jpg) [function.copy]: failed to open stream: Permission denied in /users/tntmorg/public_html/probna_4/Upload.php on line 38

Файлът не е качен, но иначе получавам данните за него: име, тип, размер:

0001.jpg
image/pjpeg
59962


Странното е, че въпросният 38-ми ред, както можете да видите, е реда, в който се използва функцията copy. (помествам кода със забележките, ако някой реши да го ползва - както отбелязах - иначе работи).
В предишните скриптове си мислех, че проблемът е в неточното указване на пътя (извън класа), но все повече си мисля, че проблемът е в хоста ми. Какви биха могли да бъдат причните функцията copy да не работи? А може би имам грешка другаде (?!), макар че копирах кода от работещия скрипт в awardspace.com.
На 3-ти ще изтормозя администраторите на топхост да ми обяснят доста странности около услугата, която предлагат, но все пак, ще ми помогнете много, ако ме ориентирате за проблема.

Благодаря предварително!
 
images/ тази директория трябва да е с атрибути 0777.
Иначе няма да може да се качи файл в нея.
Трябва скрипта upload.php да има права да създава файлове в нея.
 
Здравей, Админ! :)

Знам за правата, когато директорията се създава от скрипт, но тази директория я създавам от с-панела :(
Има ли разлика? Там би трябвало да имам пълни права или...?
 
sizif каза:
Здравей, Админ! :)

Знам за правата, когато директорията се създава от скрипт, но тази директория я създавам от с-панела :(
Има ли разлика? Там би трябвало да имам пълни права или...?

О не.
Ти имаш права но скрипта няма.

В Cpanel-a (файловия менаджер ) имаш отстрани едно меню.
Като селектираш директорията ще се появи отдясно.
Там едното е permission(атрибути).
Трябва да ги направиш 0777.
 
Благодаря! :)

Ще опитам още сега! Това за настройката на правата го научавам току-що (и се чувствам глупаво :shock: )...

ПП: Погледнах, наистина има такъв раздел (много полезна информация - мисля си :) , но указаните права са пълни :(

Идва ли ти наум някаква друга причина? Да се налага да инсталирам нещо, за да работи copy? Или пък аналогична функция?!
 
защо неизползаш move_uploaded_file вмесно copy макар проблема мисля че е това което каза админ
 
Благодаря! :)

Ще опитам, само че не съм използвал тази функция и не зная какъв е синтаксиса й? Като на копи ли е? Защото трябва да я вкарам в класа, а там гледам да не човъркам, защото не разбирам (поне докато се рових в уроците тук научих как се вика клас и функция от клас :) )

Иначе погледнах правата, както ми обясни Админ, дадени са пълни права...

След малко ще дам демо на кода от фрий-хоста...
 
sizif каза:
Благодаря! :)

Ще опитам, само че не съм използвал тази функция и не зная какъв е синтаксиса й? Като на копи ли е? Защото трябва да я вкарам в класа, а там гледам да не човъркам, защото не разбирам (поне докато се рових в уроците тук научих как се вика клас и функция от клас :) )

Иначе погледнах правата, както ми обясни Админ, дадени са пълни права...

След малко ще дам демо на кода от фрий-хоста...


Най-вероятно пхп файловете се изпълняват от друг потребител (не от този с който ти се логваш). Затова създай папката не през фтп-то, а чрез пхп:

<?php
mkdir('imeto_na_papkata', 0777);
?>
 
http://bg.php.net/manual/en/function.move-uploaded-file.php
move_uploaded_file ( string filename, string destination )
в случая местиш директно от папката tmp до папката която искаш
 
Благодаря ви за вниманитео към темата! Ще опитам!

Ето демо от фрийхоста (не написах скрипт за триене, моля не качвайте повече от 1-2 файла поне до утре :) ):

http://probna.awardspace.com/up.php
 
Демото е от фрий-хоста - awardspace.com. Там кодът работи. Проблема е в платения хост: топхост.бг...

ПП:
в случая местиш директно от папката tmp до папката която искаш

Май нещо не успявам да включа: какво означава папка tmp?
 
sizif каза:
Демото е от фрий-хоста - awardspace.com. Там кодът работи. Проблема е в платения хост: топхост.бг...

ПП:
в случая местиш директно от папката tmp до папката която искаш

Май нещо не успявам да включа: какво означава папка tmp?

sizif, а ти прочете ли мнението ми?
при топхост пхп файловете и папките създадено от пхп скриптове се изшълняват юзер nobody, така че ти като създадеш папка през фтп-то тя се създава от твоя юзер, и nobody няма права над нея. Съответно не можеш да преместиш/копираш файла.
Налага ми се да излизам и нямам време за подробности. Надявам се да си ме разбрал.

ЕДИТНАХ мнението, че бях написал глупост!
 
sizif каза:
ДМай нещо не успявам да включа: какво означава папка tmp?
доколкото си спомням при upload фаила първо се качва в папка тмп ( за временно съхранение ) и след това се копира там където искаш с функцията copy
move_uploaded_file се използва по същия начин както копи

$image=$_FILES['image'];
move_uploaded_file($image['tmp_name'], $upload_dir.$image['name'] )
 
Аз мисля, че като си смени атрибутите на папката всичко ще е наред.
Даже съм 99% сигурен. :)
 
Здравейте!

Не, не съм ги сменял, но когато проверих, директорията имаше указани пълни права: четене, писане, изтриване... :(
Проблемът е другаде, но нямам и най-бегла представа къде...

Засега работя по кода за ъплоуд на фрий-хоста си - awardspace.com. Там подкарах и първия скрипт за ъплоуд+рисайз, който бях пуснал в по-ранна тема (както писах и тук и при двата скрипта платения хост ми дава един и същ проблем), така че въпросите ми към администраторите на топхост.бг ще са доста :)

Възможно е да не съм направил нещо, както трябва, но факта си е факт - на фрий-хоста кодовете работят (този с рисайза използва функции от ГД-библиотеката), а в топхост - не...

Благодаря на всички ви за вниманието към темата и за предложенията, които ми дадохте. Засега оставям проблема до сряда, когато ще говоря с хората от топхост... Надявам се, че тогава ще имам по-ясна представа :)

Ето препратка към темата с кода за ъплоуд+рисайз (кода е вътре):
http://www.web-tourist.net/forum/viewtopic.php?t=3601

Не помня откъде съм го взел, но РАБОТИ. Ако успея да обработя заявката от един js и не срещна други проблеми, до два-три дни ще пусна скриптове за създаване на галерия...
 
sizif каза:
Здравейте!

Не, не съм ги сменял, но когато проверих, директорията имаше указани пълни права: четене, писане, изтриване... :(
Проблемът е другаде, но нямам и най-бегла представа къде...

Засега работя по кода за ъплоуд на фрий-хоста си - awardspace.com. Там подкарах и първия скрипт за ъплоуд+рисайз, който бях пуснал в по-ранна тема (както писах и тук и при двата скрипта платения хост ми дава един и същ проблем), така че въпросите ми към администраторите на топхост.бг ще са доста :)

Възможно е да не съм направил нещо, както трябва, но факта си е факт - на фрий-хоста кодовете работят (този с рисайза използва функции от ГД-библиотеката), а в топхост - не...

Благодаря на всички ви за вниманието към темата и за предложенията, които ми дадохте. Засега оставям проблема до сряда, когато ще говоря с хората от топхост... Надявам се, че тогава ще имам по-ясна представа :)

Ето препратка към темата с кода за ъплоуд+рисайз (кода е вътре):
http://www.web-tourist.net/forum/viewtopic.php?t=3601

Не помня откъде съм го взел, но РАБОТИ. Ако успея да обработя заявката от един js и не срещна други проблеми, до два-три дни ще пусна скриптове за създаване на галерия...

sizif, изтрий папката image. Сlед това отвори един текстов редактор и пейстни следния код:
<?php
mkdir('image', 0777);
?>

запиши го с разширение .php и го качи на платения ти хост, там където трябва да ти е папката image. Зареди файла в браузъра ти за да създадеш папката. Сега вече трябва да можеш да качваш снимките...

Номера е в това, че сега папката ще е собсвеност на nobody и вече ще можеш да копираш/местиш снимките в нея. (между другото, мисля, че няма да можеш да я триеш през фтп, пак заради това, че тя няма да е собсвеност на юзера с който си се логнал)
 

Back
Горе