Проблем със запис.

sizif

Registered
Здравейте и честита Нова година на всички!
Здраве и късмет!

Опитвам се да обработя форма за ъплоуд на файлове (преди да я пратя към ъплоудващия скрипт), която има н-брой полета, създавани от js (скоро ще пусна кода като урок).

Името на първото поле е userfile1, а всяко следващо увеличава цифрата зад userfile с 1, така че второто поле е с име userfile2, третото - userfile3 и т.н.

Използвам следния код, за да обработя всички полета:

<?
$urlcount=$HTTP_POST_VARS['urlcount']; \\броя на всички изпратени полета

for($i=1; $i<$urlcount; $i++){

$image=$HTTP_POST_VARS['userfile.$i'];\\а това трябва да създава динамично ИМЕТО на променливата userfile, така че да се обходят всички получени стойности от формата
echo "<BR>$image";
}
echo "<BR><B>$urlcount</B>";
?>


В случая искам само да листвам имената на файловете, приети от формата за ъплоуд. Ако успея да подкарам кода, във фор-цикъла ще вкарам и скрипта извършващ ъплоуда.

Проблемът е, че не зная как да създавам динамично името на променливата в квадратните скоби на $HTTP_POST_VARS['']. По начина, по който се опитвам да го направя не се получава и скрипта продължава да търси променлива userfile, вместо да добавя нужната цифра към името й (взета от текущата стойност на $i).
Възможно ли е да се направи такъв запис?

Лесно мога да реша проблема по хамалския начин като изпиша десет пъти въпросния ред и само проверявам дали съществува променлива, но това обезсмисля използването на динамично създавани полета във формата :(

Моля, помогнете ми да се справя със задачата!

Благодаря предварително!
 
я пробвай с $img_name[$i]
:)
ако нестане ще ти дам един скрипт дето преди бях писал с няколко полета за избиране на файл (както е и твоя) .
 
Здравей!
Веднага ще пробвам, макар че ми се струва че ще го възприеме като елемент от масив ?

$image=$HTTP_POST_VARS['userfile[$i]']; така ли?
Защото в случая нямам масив а свободни променливи с поредност в имената... userfile1, userfile2, userfile3 и т.н. Целта ми е към userfile в скобите да се добавя цифрата, така че цялото да се смята за име на променливата.

Пробвам още сега и ти връщам отговор...

Благодаря, че погледна темата! :)

ПП: пробвах по горния начин, не става. Струва ми се, че не хващам идеята ти...
 
не,
значи във формата имаш нещо от рода на
<input type=file name=img[] size=30>
при пхп-то
имаш САМО $img_name[$i]
t.e. $image=$HTTP_POST_VARS['userfile.$i'];
не ти е нужно
echo $img_name[$i]
и виж дали ще ти изкара записите.. нататък мисля , че ще се оправиш
 
Виж, скрипта не ми праща масив, а променливи. Знам, как да обходя масив (и щеше да ми е 200 пъти по-лесно да го човъркам както ми хрумне), но такъв не съществува и няма как да създам (освен ако не го пиша на ръка, което е безсмислица)

От формата получавам променливи:

<input type=file name="userfile1" size=30>

Скрипта създава другите полета по същия начин, т.е. ако ги изписваше с тагове, следващото поле е:

<input type=file name="userfile2" size=30>

и т.н.


Иначе казано нямам име от формата userfile[], което да връща масив, а свободни променливи... :(

Единственото, което знам за тях е броят им и това че ИМЕНАТА им са 'userfile+1'. Трябва ми запис, който да отразява динамичната смяна на имената...
 
хм..
а задължително ли е да ползваш тоя js?
и ако е.. неможе да няма начин да вкараш [] :roll:
а ако не е задължителен неможе ли да направиш нещо такова:
for ($j=0; $j<5; $j++) {
?>
<input type=text name=img[] size=30><br>
<?
}
 
Ще ми се да го използвам. Зная, че все някак се обработва - взех го от файловия мениджър на хит.бг и е удобен за самия потребител, освен това ще спести излишен код при обработката...

Иначе нищо не ми пречи да вкарам пет фиксирани полета или десет и само да проверявам колко от тях ми връщат стойност...

Трудно се справям с Джаваскрипт, а този е доста сложен, за да сменя името, още повече, че е много по-комплексен като функция - обработва и чекбокс (с имената на качените файлове) за редакция и т.н....
 
бтв май се сетих за нещо , но незнам дали ще работи:
for ($i=1; $i<$urlcount; $i++) {
echo $_POST['userfile'.$i];

}

сигурно ще върне грешка ама го пробвай..
А и междо другото тоя скрипт в хит.бг май не работеше под FireFox , mute си беше написал някакъв подобен и работеше перфектно.
 
Така го мъчих вече, не работи :(

Иначе js праща каквото трябва - листвал съм променливите по хамалския начин - като им пиша имената... :(

Върти ми се идеята да създавам масив, в който имената на променливите от формата са стойности на елементите му, но все ми се струва, че трябва да има и по-лесен начин......

Всъщност и с масива няма да стане - пак опирам до записа в квадратните скоби: ако сложа в тях $masiv[$i] ще търси изпратен масив и елемент $i... :( Вече опитвах нещо подобно...
 
Благодаря, струва ми се логично, ще пробвам веднага! ;) Дано стане!!

Благодаря ти! Много ти благодаря!!! Стана!

А един въпрос още, какъв трябва да бъде записа, за да ми брои име, ако променливата в скобите не касае файл? Т.е аналогичен случай, но вместо стойност-име на файл, обикновена променлива. Или възможен ли е този запис:

Имам променливи $aaa1, $aaa2, $aaa3 и т.н.

echo $_POST['aaa'.$i]['name'];

Ще ми трябва нещо такова за по-късно, ако не става, ще мисля по друг начин...
 
:)
нещо неможах да ти схвана въпроса .. дай някакъв пример , че от този неразбрах нищо :?
това ['name']
вади елемента от масива.
ако направиш
print_r($_FILES['userfile'.$i]);
ще разбереш.
 
Пробвах си идеята, не се получи :)
Иначе ще погледна мануала на РНР за регистрите - явно имам нужда :)

Благодаря ти много за помощта!

Хубава нощ!
 
Малко прибързана се оказа радостта ми... Оказва се, че съм питал за нещо, което взето само по-себе си не решава проблема.
Мислех си, че ще е достатъчно да направя това:

$urlcount=$HTTP_POST_VARS['urlcount'];

for($gan=1; $gan<($urlcount+1); $gan++){
$image=$_FILES['userfile'.$i]['name'];


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

Ето скрипта за ъплоуд:
(обработва едно поле с име $image)

<?
define ("MAX_SIZE","100");
define ("WIDTH","150");
define ("HEIGHT","100");
function make_thumb($img_name,$filename,$new_w,$new_h)
{
$ext=getExtension($img_name);
if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext))
$src_img=imagecreatefromjpeg($img_name);
if(!strcmp("png",$ext))
$src_img=imagecreatefrompng($img_name);
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
$ratio1=$old_x/$new_w;
$ratio2=$old_y/$new_h;
if($ratio1>$ratio2) {
$thumb_w=$new_w;
$thumb_h=$old_y/$ratio1;
}
else {
$thumb_h=$new_h;
$thumb_w=$old_x/$ratio2;
}
$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
if(!strcmp("png",$ext))
imagepng($dst_img,$filename);
else
imagejpeg($dst_img,$filename);
imagedestroy($dst_img);
imagedestroy($src_img);
}
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$errors=0;

if(isset($_POST['Submit']))
{
$image=$_FILES['image']['name'];
if ($image)
{
$filename = stripslashes($_FILES['image']['name']);
$extension = getExtension($filename);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png"))
{
echo '<h1>Не известно разширение!</h1>';
$errors=1;
}
else
{
$size=getimagesize($_FILES['image']['tmp_name']);
$sizekb=filesize($_FILES['image']['tmp_name']);
if ($sizekb > MAX_SIZE*10240)
{
echo '<h1>Надвишен е лимитът за размер!</h1>';
$errors=1;
}
$image_name=time().'.'.$extension;
$newname="images/".$image_name;
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied)
{
echo '<h1>Копирането не е успешно!</h1>';
$errors=1;
}
else
{
$thumb_name='images/thumbs/thumb_'.$image_name;
// call the function that will create the thumbnail. The function will get as parameters
//the image name, the thumbnail name and the width and height desired for the thumbnail
$thumb=make_thumb($newname,$thumb_name,WIDTH,HEIGHT);
}} }}

if(isset($_POST['Submit']) && !$errors)
{
echo "<h1>Малкото копие е успешно създадено!</h1>";
echo '<img src="'.$thumb_name.'">';
}
?>


Като имате предвид, че js-та качава файловете през форма с полета, имащи имена:
За първото userfile1, и за всяко следващо увеличава цифрата зад userfile с 1, така че второто поле е с име userfile2, третото - userfile3 и т.н.
А кода за ъплоуд търси стойност само от едно поле с име $image, как би трябвало да изглежда целия скрипт, за да работи?

Благодаря предварително!

ПП: струва ми се, че май се оплетох в обяснения, ако нищо не сте разбрали, утре ще опитам да бъда по-ясен...
 
наскоро правих нещо подобно
$urlcount=$HTTP_POST_VARS['urlcount'];

for($i=1; $i<($urlcount+1); $i++){
$image[$i]=$_FILES['userfile'.$i]['name'];
}
и след това качваш всеки елемент от масива с ъплоад скрипта, незнам дали ще стане аз правих това само че с записване в текст в БД
 
sizif каза:
Здравейте и честита Нова година на всички!
Здраве и късмет!

Опитвам се да обработя форма за ъплоуд на файлове (преди да я пратя към ъплоудващия скрипт), която има н-брой полета, създавани от js (скоро ще пусна кода като урок).

Името на първото поле е userfile1, а всяко следващо увеличава цифрата зад userfile с 1, така че второто поле е с име userfile2, третото - userfile3 и т.н.

Използвам следния код, за да обработя всички полета:

<?
$urlcount=$HTTP_POST_VARS['urlcount']; \\броя на всички изпратени полета

for($i=1; $i<$urlcount; $i++){

$image=$HTTP_POST_VARS['userfile.$i'];\\а това трябва да създава динамично ИМЕТО на променливата userfile, така че да се обходят всички получени стойности от формата
echo "<BR>$image";
}
echo "<BR><B>$urlcount</B>";
?>


В случая искам само да листвам имената на файловете, приети от формата за ъплоуд. Ако успея да подкарам кода, във фор-цикъла ще вкарам и скрипта извършващ ъплоуда.

Проблемът е, че не зная как да създавам динамично името на променливата в квадратните скоби на $HTTP_POST_VARS['']. По начина, по който се опитвам да го направя не се получава и скрипта продължава да търси променлива userfile, вместо да добавя нужната цифра към името й (взета от текущата стойност на $i).
Възможно ли е да се направи такъв запис?

Лесно мога да реша проблема по хамалския начин като изпиша десет пъти въпросния ред и само проверявам дали съществува променлива, но това обезсмисля използването на динамично създавани полета във формата :(

Моля, помогнете ми да се справя със задачата!

Благодаря предварително!

А защо не предадеш стойностите от формуляра към пхп-то в масив?
(Знам, че знаеш как става и няма да го обяснявам.)
Тогава всичко става много по-лесно. Слагаш upload скрипта в един
while ($_FILES['userfile']) {
upload script
}

цикъл и би трябвало да си решил проблема
 
Здравейте!

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

бафиту ми помогна да получа името на променливите - имам ги до една, мога да ги листна, но само имената не са достатъчки. РНР-кода търси по някакъв начин във $_FILE регистъра и в TMP (може би има по-различен път към ТМП (до скоро не знаех, какво е това)) и само промяната в името на променливата с файла се оказва недостатъчно...

Нещо повече, дори да направя масив image[] и да актуализирам имената на променливите в кода по този начин, пак ми се струва, че няма да тръгне... Не мога да го обясня, защото схващам проблема само интуитивно, но грешката която ми дава - фатал ерор, с обяснение предефинирана променлива ми е достатъчна да разбера, че така не става... Погледнете кода и ще видите, че името на променливата която му давам няма значение - кода си търси една точно определена и то я търси янколко пъти... Другото е, че изглежда оплитам имена и стойности - името на променливата става стойност на нова променлива и обратното

Опелтох се в обяснения, накратко: мисля, че не получавам пълния път до временното местоположение на файловете, вече качени на хоста или че търся различни имена на променливи в регистрите...

Регистрите са ми мъгла и имам чувството, че налучквам...

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

ПП: ето и джаваскрипта с формата (взел съм го от файл мениджъра на хит.бг, движи и други неща освен формата за ъплоуд):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<title>GAN Menager</title>

<script language="JavaScript">

</script>
</head>
<body bgcolor="#999999" text="#000000" topmargin="2" marginheight="2" leftmargin="2" marginwidth="2">

<table width="100%" border="0" cellspacing="0" cellpadding="4" align="center" bgcolor="#CCCCCC">
<tr>
<td valign="top" colspan="2" class="hnm">

<FORM name="f2" method="post" enctype="multipart/form-data" action="up_echo.php" onSubmit="return checkthis();">
<table border=0 cellpadding=2 cellspacing=0 bgcolor=#ffffff width="100%">
<tr><td bgcolor=#959d90 width=1% class="hnm"> Location </td><td bgcolor=#cccc99><input name="dir" value="/">
<input type="submit" value="Go">
<input type="button" value="Back" onClick="return GoBack();">
<input type="submit" value="Delete" name="delete" onClick="return CheckDelete();">
<input type="button" value="Cut" name="Cut" onClick="return CopyToClipboard();">
<input type="submit" value="Paste" name="paste" onClick="return CheckClipboard();">
</td></tr>
</table>



<table><tr><td>
<input type="submit" value="Upload" name="upload">    
<input type="button" value="<<" name="xxl" onClick="bl_onclick(this)">   </td>
<td><div id="cf">1</div></td>
<td>   <input type="button" value=">>" name="xxr" onClick="br_onclick(this)">    files
</td></tr></table>
<input type="hidden" name="urlcount" value="1">
<input type="file" name="userfile1" size="40">


<input type="hidden" name="sortorder" value="asc">
<input type="hidden" name="sortfield" value="0">
<input type="hidden" name="clipboard" value="">
</form>
</td>
</tr>
</table>

</body>
</html>


Сега като го гледам май изпраща и масив... Ще го пробвам, но проблема с кода за ъплоуд остава. как да направя така, че да може да се вкара в тялото на цикъл и да обработи информацията от повече от едно поле за ъплоуд?

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

Благодаря ви за участието до тук!

PP:Не изпраща масив - объркал съм функциите :( Все пак ще се помъча да получа променливите в масив...
 
Здравей, Slavei!

Отказах се от джаваскрипта, но това, което ми препоръчваш - признавам си - все повече си мисля, че не ми е ясно...

Ето целия код така, както го имам и както работи - с едно поле за ъплоуд:

<?
define ("MAX_SIZE","100");
define ("WIDTH","150");
define ("HEIGHT","100");
function make_thumb($img_name,$filename,$new_w,$new_h)
{
$ext=getExtension($img_name);
if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext))
$src_img=imagecreatefromjpeg($img_name);
if(!strcmp("png",$ext))
$src_img=imagecreatefrompng($img_name);
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
$ratio1=$old_x/$new_w;
$ratio2=$old_y/$new_h;
if($ratio1>$ratio2) {
$thumb_w=$new_w;
$thumb_h=$old_y/$ratio1;
}
else {
$thumb_h=$new_h;
$thumb_w=$old_x/$ratio2;
}
$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
if(!strcmp("png",$ext))
imagepng($dst_img,$filename);
else
imagejpeg($dst_img,$filename);
imagedestroy($dst_img);
imagedestroy($src_img);
}
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$errors=0;

if(isset($_POST['Submit']))
{
$image=$_FILES['image']['name'];
if ($image)
{
$filename = stripslashes($_FILES['image']['name']);
$extension = getExtension($filename);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png"))
{
echo '<h1>Не известно разширение!</h1>';
$errors=1;
}
else
{
$size=getimagesize($_FILES['image']['tmp_name']);
$sizekb=filesize($_FILES['image']['tmp_name']);
if ($sizekb > MAX_SIZE*10240)
{
echo '<h1>Надвишен е лимитът за размер!</h1>';
$errors=1;
}
$image_name=time().'.'.$extension;
$newname="images/".$image_name;
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied)
{
echo '<h1>Копирането не е успешно!</h1>';
$errors=1;
}
else
{
$thumb_name='images/thumbs/thumb_'.$image_name;
// call the function that will create the thumbnail. The function will get as parameters
//the image name, the thumbnail name and the width and height desired for the thumbnail
$thumb=make_thumb($newname,$thumb_name,WIDTH,HEIGHT);
}} }}

if(isset($_POST['Submit']) && !$errors)
{
echo "<h1>Малкото копие е успешно създадено!</h1>";
echo '<img src="'.$thumb_name.'">';
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>PHP Създаване на малко копие</title>
</head>
<body>
<form name="newad" method="post" enctype="multipart/form-data" action="">
<table>
<tr><td><input type="file" name="image" ></td></tr>
<tr><td><input name="Submit" type="submit" value="Качи"></td></tr>
</table>
</form>
</body>
</html>


Как трябва да го направя (ако може, обяснете ми го в детайли), за да работи с десет фиксирани полета за ъплоуд?

Не успях да напиша форма, която да изпраща масив с имената на полетата, а и нямам идея как точно да го прекарам през скрипта...

Благодаря предварително!
 
здравей, нещо не ти разбрах проблема.. неможеш да ги обработиш тия променливи ли какво ?
даже и масив не ти трябва..
Код:
<?
if($_REQUEST['upload'])
{
$max = $_POST['urlcount'];
for ($i=1; $i<=$max; $i++){
move_uploaded_file($_FILES['userfile'.$i]['tmp_name'], "upload/".$_FILES['userfile'.$i]['name']);
 }
}
?>
това трябва да копира файловете в папката "upload"
btw пак ти казвам , че тоя JS работи само при IE.
ЕДИТ:
опа не видях последното мнение .. явно си се отказал.. :)
 
Отказах се от Джаваскрипта. Сега искам само да подкарам този рнр-скрипт така че да обработва не само едно поле, а примерно 10.
С едно поле във формата скрипта работи приказка - ъплоудва снимките и създава тумбнейл с отлично качество, но не знам как да го накарам да обработва повече полета за ъплоуд...

Можеш ли да ми помогнеш?
 

Back
Горе