PDA

View Full Version : چک کردن محتویات فایل



neda_barnamenevis
دوشنبه 19 فروردین 1387, 10:38 صبح
سلام من می خوام یک کد بنویسم که بیاد محتویات فایل را چک کنه که آیا doc هست یا نه
پسوند را نمی خوام چک کنه می خوام خود محتویات را چک کنه
منظورم اینه که می خوام چک کنه اگه یک فایل php که پسوندش را doc کردن بهم errorبده

mehran_337
دوشنبه 19 فروردین 1387, 12:39 عصر
باید توسط توابع سطح پایین فایل باز بشه و وجود تگ "<?php و یا عبارات خاصی که مد نظر هست بررسی بشه

neda_barnamenevis
دوشنبه 19 فروردین 1387, 13:13 عصر
این که کار خیلی سختیه
ّآخه من که حتما نمی دونم که فایل php بوده
ممکنه فالهای دیگه ای هم باشه من که نمی تونم همه را چک کنم
این تابع ها نمی تونن کمک کنن؟؟؟

http://ir.php.net/mime_content_type
http://ir.php.net/manual/en/ref.fileinfo.php

mehran_337
دوشنبه 19 فروردین 1387, 13:34 عصر
برای هر سوال ابتدا باید یک پاسخ منطقی پیدا کرد و سپس آن سوال و جواب را تبدیل به نرم افزار کنیم.
شما خودتان اگر یک سرچر باشید چگونه نوع واقعیه فایل را تشخیص می دهید؟
اگر جوابی دارید ( یعنی معیار و چارچوب) همان را تبدیل به کد کنید

neda_barnamenevis
دوشنبه 19 فروردین 1387, 14:04 عصر
خوب کارmime هم همینه که محتویات را چک می کنه
ولی من کار باهاش ا بلد نیستم
http://osp.ir/plugins/scmsvn/viewcvs.php/trunk/Include/Files/MimeDb.ini?rev=573&root=persism&view=markup

cybercoder
دوشنبه 19 فروردین 1387, 16:56 عصر
http://barnamenevis.org/forum/showthread.php?t=75418

موفق باشید

oxygenws
دوشنبه 19 فروردین 1387, 17:03 عصر
تابع mime_content_type رو تست کن ببین جواب می‌ده رو سرورت یا نه، اگر جواب داد که هیچی.
اگر جواب نداد، متن خطا رو بگو تا بررسی کنیم :)

اگر سرورت لینوکسه، باز هم بگو :) (و اگه ویندوزه، بهتره تلاش کن بری روی لینوکس)

neda_barnamenevis
سه شنبه 20 فروردین 1387, 07:49 صبح
من با لینوکس کار می کنم

$abstract_f = new FileUploader( 'abstract_f' );
$abstract_f->setMaxFilesize( REF_UPLOAD_MAXSIZE ); echo mime_content_type('abstract_f');

در این حالت اگه فایل doc باشه و یا phpباشه که به doc rename کرده باشیم یک چیز نشون می ده
و اونم اینه
application/octet-stream

oxygenws
سه شنبه 20 فروردین 1387, 08:17 صبح
درسته خوب، چون doc مال آفیس مایکروسافته و احتمالا فایل مجیک سرورتون ناقصه یا قدیمی یا متحجرانه!!! :)
تو می‌خوای چه فرمتی رو تشخیص بدی؟ فقط و فقط doc رو؟ چیا رو؟

neda_barnamenevis
سه شنبه 20 فروردین 1387, 08:30 صبح
فقط فایل doc
البته محتوای اونا چک کنه که اگه مثلا فایل php بود renameشده بود به doc error بده
من خیلی عجله دارم لطفا هر کی می تونه کمکم کنه

oxygenws
سه شنبه 20 فروردین 1387, 08:33 صبح
ضمنا، مطمئنی abstract_f که توی تابع mime نوشتی درسته؟
اونجا باید نام فایلی که روی هارد هست رو بدی ها!

ضمنا، این احتمال هست که docx رو درست تشخیص نده (چون جدیده!)

neda_barnamenevis
سه شنبه 20 فروردین 1387, 08:40 صبح
نامش که این جا ساخته می شه

$abstract_f->doUploadToRandumFile( REF_UPLOAD_DIR2 , $s.'-'.'ABSTRACT'.'-' )
من اینجا فقط پسوند را چک می کنم با این تابع
[code]if ( $abstract_f->loadHttpPostVars() ) {
$ext= $abstract_f->getExt();

}


if ( $ext != 'DOC'){
redirect_header ( REFER_URL."/track-accept.php", 4, _REF_INVALID_FILETYPE );
}[code]

oxygenws
سه شنبه 20 فروردین 1387, 08:42 صبح
من نفهمیدم چی گفتی!
به هر حال، پارامتر ورودی تابع mime ات نام فایلی که روی هارد ذخیره شده است، می‌باشد؟

neda_barnamenevis
سه شنبه 20 فروردین 1387, 08:49 صبح
REF_UPLOAD_DIR2 , $s.'-'.'ABSTRACT'.'-'
این نام فایلی که ذخیره می شه

oxygenws
سه شنبه 20 فروردین 1387, 08:50 صبح
به هر حال، چک کردن دستی فقط doc نباید سخت باشه.
اول ببین با تابع mime درست کار کردی یا نه.

اگر فهمیدی درست کار کردی و تابع به دردت نخورد، بهترین و سریعترین راه کار کردن دستی است. من الگوریتمش رو می‌نویسم، برنامه‌نویسی‌اش با خودت.

۱- چندین بایت اول فایلت رو باز کن (۵۰ تا هم زیاده!)
۲- (طبق magic) فایل ورد (بالاتر از ورد ۶) یکی از سه نوع زیر می‌باشد، از کاراکتر صفرم، با یک سری از حروف زیر شروع شود:

376 067 0 043
333 245- 0 0 0
320 317 021 340 241 261 032 341۳- اگر فایل با یکی از این ۳ تا شروع شده بود، پس فایل ورد است.

پ.ن۱: دقت کن که اعداد موجود در مورد دوم، اعداد اکتال (۸تایی) می‌باشند، و اون «منفی» کاراکتر خط تیره است.
پ.ن۲: تمامی فایل‌هایی که من چک کردم، مورد سوم بودند (و حدس می‌زنم مورد اول و دوم هم مال ورد ۶ باشه!!)

oxygenws
سه شنبه 20 فروردین 1387, 08:57 صبح
عدد سومی در حالت اکتال می‌شه:

320317021340241261032341
در حالت باینری می‌شه:

11010000011001111000010001011100000010100001010110 001000011010011100001000
در حالت هگزا می‌شه:

3419E1170285621A708

:)