مقاله : upload

Iauksh
سلام
من به یک کد که بتواند فایلی را روی سرور uplode کند احتیاج دارم


متشکرم

Iauksh
upload.htm
<html>

<form action="myupload.php" method=post enctype="multipart/form-data">
submit this file: <input type=file name="userfile"><br>
<input type=submit><br>
</form>
</html>


Main upload Manengment file:

myupload.php
<html>
<?
// In PHP earlier then 4.1.0, $HTTP_POST_FILES should be used instead of $_FILES.
if(!empty($_FILES["userfile"])) {
$uploaddir = "/upload/" // set this to wherever
//copy the file to some permanent location
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir . $_FILES["userfile"]["name"])) {
echo("file uploaded");
} else {
echo ("error!");
}
}
?>
</html>


یرای کار با فایل آپلود شده از

$_FILE[]
استفاده می کنیم که چند ورودی آنرا برای شما می نویسم توجه کنید این آرایه خلاصه همان آرایه http_post_files است و در ضمن یک آرایه دو بعدی است.




$_FILES["userfile"]["name"]
نام اصلی فایل روی سیستم کاربر


$_FILES['userfile']['type']
نوع فایل که در صورت پشتیبانی مرورگر نمایش داده می شود مثل"image/gif"

$_FILES['userfile']['size']
اندازه فایل

$_FILES['userfile']['tmp_name']
نام موقتی فایل روی سرور



بعد از اینکه فایل با موفقیت آپلود شد می توانید از تابع

move_uploaded_file()
برای انتقال آن به مکان دلخواه استفاده کنید

برای اطمینان از موفقیت در آپلود فایل نیز می توانید از تابع


[b]is_uploaded_file()[/b]

Tells whether the file was uploaded via HTTP POST (PHP 3>= 3.0.17, PHP 4 >= 4.0.3)
bool is_uploaded_file ( string filename )

استفاده کنید که مثال آنرا نیز در زیر برایتان می آورم


<?php
/* Userland test for uploaded file. */
function is_uploaded_file($filename) {
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname(tempnam('', ''));
}
$tmp_file .= '/' . basename($filename);
/* User might have trailing slash in php.ini... */
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}

/* This is how to use it, since you also don't have
* move_uploaded_file() in these older versions: */
if (is_uploaded_file($HTTP_POST_FILES['userfile']) ) {
copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack: filename '$HTTP_POST_FILES[userfile]'.";
}
?>


در مرجع کامل php در php.netنیز این مطلب با عنوان
Handling file uploads
بیان شده است

در ضمن درwww.zend.comنیز مقالات بسیار جالب و کاملی در این زمینه وجود دارد
آدرس یکی از مقالات که کمک زیادی به شما خواهد کرد

http://www.zend.com/zend/spotlight/uploading.php

Iauksh
سلام

خیلی خیلی از شما متشکرم
من از این کد روی دستگاهم استفاده کردم و جواب داد ولی روی سرور این پیغام را می دهد:


Warning: SAFE MODE Restriction in effect. The script whose uid is 610 is not allowed to access /var/www/html owned by uid 0 in /home/virtual/site107/fst/var/www/html/upload.php on line 8
error!

در صورتی که من می توانم از طریق ftp در این پوشه فایل بریزم

Iauksh
توجه کنید در این اسکریپت از آدرس دهی های یونیکس استفاده شده ولی به هر حال من تا کنون به چنین مشکلی بر نخورده ام .فکر کنم سئوال شما راDelphiAssistantبتواند پاسخ دهد و یا با واحد پشتیبانی سرورتان تماس بگیرید
این اسکریپت تنها یک مثال است توصیه می کنم حتما مقاله ای را که آدرسش را برایتان گذاشته ام مطالعه کنید :o

ویرایش:
من امشب یک کلاس کامل برای این کار می نویسم و فردا اینجا قرار میدهم

Iauksh
به شما قول یک کلاس را داده بودم ولی وقتی روی آن کار میکردی دیدم می توان آنرا برای تمامی پردازش های فایل گسترش داد .سعی میکنم آنرا تا آخر این هفته تمام کنم تا بتوانید به صورت یک نرم افزار سورس باز و آموزشی از آن استفاده کنید.

کد زیر چندان تر و تمیز نیست ! چون هدفم تنها نشان دادن چند نکته و نحوه استفاده از آن ها بود
به هر حال برای استفاده معمولی نیز می توان از آن استفاده کرد.همان طور که گفتم کد های اصلی را نیز که کمی پیشرفته تر هستند تا آخر این هفته در قالب یک متد از کلاس پردازش فایل در اختیارتان می گذارم.

فرم html من با نام fileuploading.htm



My HTML form it name is fileuploading.htm

<form enctype="multipart/form-data" action="fileuploading.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>



برنامه php من با نام fileuploading.php





<?php

/*-------------------------------------------
This is educational file handeling in post method writen with houtanal

Usage function:
1- bool move_uploaded_file ( string filename, string destination )
2- bool isset ( mixed var [, mixed var [, ...]] )
3- bool file_exists ( string filename )
4- int fileatime ( string filename )
5- int filemtime ( string filename )
6- int filesize ( string filename )
7- string date ( string format [, int timestamp ] )
8- bool print_r ( mixed expression [, bool return] )

Usage keword:
1- $_FILES[][] = $HTTP_POST_FILES[][]

Information about $_FILES[][]:

1-1: $_FILES['userfile']['name']
The original name of the file on the client machine.

1-2: $_FILES['userfile']['type']
The mime type of the file, if the browser provided this information. An example would be "image/gif".

1-3: $_FILES['userfile']['size']
The size, in bytes, of the uploaded file.

1-4: $_FILES['userfile']['tmp_name']
The temporary filename of the file in which the uploaded file was stored on the server.

1-5: $_FILES['userfile']['error']
The error code associated with this file upload. ['error'] was added in PHP 4.2.0

2- @ This character is for error handeling

-------------------------------------------*/

//note : you can change the php.ini for select the
//defult tmp address and defult maximum size and
//Whether or not to allow HTTP file uploads.


Main program starting:


$uploaddir = 'C:/apache2/htdocs/'; //yo path address which want upload file save in that

$uploadfile = $uploaddir. $_FILES['userfile']['name']; // the uploaded file destenision

if(isset($_FILES['userfile'])) //userfile is you form filed name
{
if(file_exists($_FILES['userfile']['name'])){
echo "this file has been exists in &<b>".$uploaddir."</b>&with this information:<p>";

echo "File name is:&".$_FILES['userfile']['name']."&<p>";

echo $_FILES['userfile']['name']."&&> &Was <b>last accessed</b> in:& "
.date("D M j G:i:s T Y", fileatime($_FILES['userfile']['name']))."<p>";

echo $_FILES['userfile']['name']."&&> &Was <b>last modified</b>:& "
. date ("D M j G:i:s T Y", filemtime($_FILES['userfile']['name']))."<p>";

echo $_FILES['userfile']['name']."&&> &<b>Size</b> is:& "
.filesize($_FILES['userfile']['name'])."Bytes<p>";

echo "<a href='test.htm'>Back to file choose!</a>";
}
else{
print "<pre>";
if (@move_uploaded_file($_FILES['userfile']['tmp_name '], $uploadfile)) {
print "File is valid, and was successfully uploaded. ";
print "Here's some more information:\n";
print_r($_FILES);
echo "<a href='test.htm'>Back to file choose!</a>";
}
else {
print "Possible file upload attack! Here's some debugging info:\n";
print_r($_FILES) //Print_r() print the arrays data;
}
print "</pre>";
}
}

?>

Iauksh
خیلی متشکرم
من از این کد استفاده کردم ظاهرا فایل را منتقل کرده ولی وقتی به سرور وصل می شوم می بینم که فایل نیست

Iauksh
این دو خط مسئول آدرس دهی هستند


$uploaddir = 'C:/apache2/htdocs/'; //yo path address which want upload file save in that

$uploadfile = $uploaddir. $_FILES['userfile']['name']; // the uploaded file destenision


همان طور گه گفتم این کد را بنا به نیاز های خود باید تغییر دهید

Iauksh
سلام
خوب چون من فایلها را روی سرور می گذارم مسیر کامل را ندارم
گزارشی که بعد از اجرای برنامه به من می دهد نشان دهنده انتقال فایل است


به هر حال خیلی متشکرم