file típus ellenőrzés

lili_ képe

Sziasztok!

fejlesztek saját modult, amibe kellene validate-t fvényt írnom, ami leellenőrzi, h a feltöltendő file kiterjesztése pdf, vagy txt, ellenben hibát ír ki

van egy olyan fvény h 'file_validate_extensions'

a kódom

function infocsop_application_fer_form(&$form_state){
 
 $form['#attributes']['enctype'] = 'multipart/form-data';
    $form['document_upload'] = array(
      '#type' => 'file',
      '#title' => t('File'),
      '#required' => FALSE,
      '#description' => t('Click "Browse" to select a file to upload.  The maximum file size per upload is %size MB.', array('%size' => round(file_upload_max_size()/(1024*1024), 0))),
      '#weight' => -5,
      );
 
 
$form["submit"] = array(
		"#type" => "submit",
		"#value" => t("Submit"),
		"#validate" => array("infocsop_application_fer_validate"),
		"#submit" => array("infocsop_application_fer_submit"),
    );
 
    return $form;
 
    }
 
    function infocsop_application_fer_validate($form, &$form_state){
 
 
if (isset($form['document_upload'])) {
    $validators = array(
      'file_validate_extensions' => array('txt')
    );
 
    $file = file_save_upload('document_upload', $validators);
    if (!$file)
      form_set_error('upload', 'You must select a valid file to upload.');
    else {
      $form_state['values']['title'] = $file->filename;
      $form_state['values']['myfile'] = $file;
    }
  }
 
}
 
function infocsop_application_fer_submit($form, &$form_state){
 
$file_meret_kep =  $_FILES["files"]["size"]["document_upload"];
 
 
if($file_meret_kep!=0){
 
 
$utvonal_kep=file_directory_path()."/persons";
 
//feltöltendő file neve
$nev_kep = $_FILES["files"]["name"]["document_upload"];
 
 
  $tmp_name_kep = $_FILES["files"]["tmp_name"]["document_upload"];
 
 
 //és utána elmentem az általam megadott könyvtárba
 
if (file_check_directory($utvonal_kep, FILE_CREATE_DIRECTORY))
	{
			$file_kep = file_save_upload("document_upload", NULL, $utvonal_kep);
			/*VALÓBAN FEL LETT - E TÖLTVE A FILE*/
     }
 
  drupal_set_message("A ". "$nev_kep"." file was uploaded.");
  }
 
}
 
nem ír ki hibát akkor, ha nem a megfelelő típusú file-t töltöm fel
minden tartalom típust feltölt
 
valaki tudna nekem segíteni a kódban?
Drupal verzió: 
eMeLA képe

És milyen hibaüzenet ír ki ?

0
0

...mit tudok: http://web.termuves.hu

lili_ képe

üzenetet nem ír ki pont ez a baj h nem jelez semmilyen típusnál, mindet engedi feltölteni még jpeg-et is.

0
0

mini

Bálint képe

Ha megnézed a file_save_upload függvény paraméterezését, a $validators tömb felépítése úgy néz ki, hogy a kulcsok a függvénynevek, és az értékei pedig tömbök, amik a függvény paramétereit tartalmazzák. A file_validate_extensions függvény pedig két paramétert vár, az első a fájl objektum, a második pedig egy string, ami szóközzel elválasztva tartalmazza a megengedett kiterjesztéseket. Te pedig kihagytad a fájl objektumot.
Szóval szerintem így helyes:

<?php
$validators = array(
      'file_validate_extensions' => array('document_upload', 'txt pdf'),
    );
?>

Ez tényleg csak tipp, nem vagyok benne biztos, de egy próbát megér. :)
0
0
lili_ képe

beírtam amit javasoltál a de nem jártam sikerrel, köszike azért
file_validate_extensions függvényt is akartam használni, de mivel objektumot vár, nem tudom hogyan is kell akkor átadni a paraméterbe a formot??

azért tovább próbálkozok

0
0

mini

Bálint képe

Szerintem ezzel van a baj, hogy amit én írtam első paraméternek, az nem fájl objektum.

0
0
lili_ képe

ijj az meglehet, igen objektumot vár, csak abban egyenlőre nem vagyok jártas miként lehetne
egy objektumot gyártani a form elemből

tovább keresgélek

próbáltam egy olyat csinálni, h . alapján szétszedtem a file nevét egy tömbbe, és a legultsó tömb elemre szabadítok rá feltételt h txt vagy pdf de mindenféleképpen a drupal fvényt szeretném használni, majd beírok amint tudok értelmeset, de ha valaki tud segíteni szerintem ez sok mindenki számára hasznos lehet a jövőben

0
0

mini

sgabe képe

Van egy tippem, hogy működik a kódod, csak nem látod, mert uber user esetén nem fut le az ellenőrzés. Jelentkezz ki és próbáld ki úgy.

<?php
function file_validate_extensions($file, $extensions) {
  global $user;
 
  $errors = array();
 
  // Bypass validation for uid  = 1. !!!
  if ($user->uid != 1) {
     ...
  }
  return $errors;
}
?>
0
0
lili_ képe

neked is köszönöm, ki fogom próbálni csak most azon vagyok h konkrétan a file_validate_extension fvényt használjam, nem pedig a file_save_upload fvényt

de nem tudom hogyan kellene a file form-ból objekumot gyártani:(
de nem adom fel

0
0

mini

sgabe képe

A file_save_upload() használata a helyes út. Ez egyben elvégzi a validálást és a feltöltést is, valamint létrehozza a $file objektumot is, amivel a továbbiakban azt csinálsz, amit akarsz. Az infocsop_application_fer_validate() függvény is teljesen szükségtelen. A hook_validate() node és nem file validálásra van. A submit() hurkodban végrehajthatod az egész műveletet.

update: látom, az nem hook_validate() akart lenni, ettől függetlenül nem kell :)

<?php
function foo_menu() {
	$items = array();
	$items['foo'] = array(
    	'title' => 'Foo',
    	'page callback' => 'page_example_foo',
    	'access arguments' => array('access content'),
	);
	return $items;
}
 
function page_example_foo() {
	return drupal_get_form('foo_form');
}
 
function foo_form(&$form_state){
	$form['#attributes'] = array('enctype' => "multipart/form-data");
 
    $form['upload'] = array(
		'#type' => 'file',
    	'#title' => 'Filename'
	);
 
	$form['submit'] = array(
    	'#type' => 'submit',
    	'#value' => 'Upload file',
    	"#submit" => array("foo_submit"),
	);
 
	return $form;	
}
 
function foo_submit($form, &$form_state){
	$validators = array('file_validate_extensions' => array('txt'));
	$path = file_directory_path()."/directory";
	if (file_check_directory($path, FILE_CREATE_DIRECTORY)) {
	  	if ($file = file_save_upload('upload', $validators, $path)) {
	  		$name = $_FILES["files"]["name"]["upload"];
			  drupal_set_message("The ". "$name"." file was uploaded.");
		}
	}
}
?>
0
0
lili_ képe

szuper ezer hála, nagyon köszönöm

De az a helyzet, h az űrlapomnak sok eleme van név, cím stb, és amikor rossz kiterjesztésű file-t próbál feltölteni valaki --> hiba esetén a form újra fog töltődni, és ez eddig beírt adatok is el fognak tűnni, jó session változóval meg lehet oldani, de ezért is akartam használni a file_validate_extensions fvényt a validate-ban, vagyis h ne kerüljön át a vezérlés a submitra ha nem jó a file kiterjesztése, de akkor finomítok ezen a megoldáson

0
0

mini

sgabe képe

Jó lenne tudni, hogy mi lesz ezeknek az adatoknak a sorsa.

Egy lehetséges megoldás, hogy ideiglenes változóba mented a bevitt adatokat a variable_set() használatával. Az űrlapodban pedig beállítod az alapértelmezett értékeket a variable_get() segítségével, majd az űrlap sikeres elküldésével törlöd ezeket a variable_del() meghívásával.

Persze, ha most node objektumokról beszélünk, akkor máris nem ez a jó megoldás, de jelen pillanatban nem tudjuk mi lesz az elküldött űrlap sorsa.

<?php 
function foo_form(&$form_state){
	$form['#attributes'] = array('enctype' => "multipart/form-data");
 
	$form['textfield'] = array(
  		'#type' => 'textfield',
  		'#title' => t('Textfield'),
  		'#default_value' => variable_get('submitted_text',''),
  		'#size' => 60,
  		'#maxlength' => 128,
  		'#required' => TRUE,
	);
 
  	$form['upload'] = array(
		'#type' => 'file',
    	'#title' => 'Filename'
	);
 
	$form['submit'] = array(
    	'#type' => 'submit',
    	'#value' => 'Upload file',
    	"#submit" => array("foo_submit"),
	);
 
	return $form;	
}
 
function foo_submit($form, &$form_state){
	$validators = array('file_validate_extensions' => array('txt'));
	$path = file_directory_path()."/directory";
	variable_set('submitted_text', $form_state['values']['textfield']);
	if (file_check_directory($path, FILE_CREATE_DIRECTORY)) {
	  	if ($file = file_save_upload('upload', $validators, $path)) {
	  		$name = $_FILES["files"]["name"]["upload"];
			drupal_set_message("The ". "$name"." file was uploaded.");
			variable_del('submitted_text');
		}
	}
}
?>
0
0
lili_ képe

olyan űrlapról lenne szó, ahol jelentkezni lehet bizonyos kurzusra,
kért adatok, melyek adatbázisba mennek:
név, ország, cím, születési dátum, város, cím
mindenkinek kötelező magáról egy önéletrajzot, ami pedig a sites/default/files egyik alkönyvtárában fog majd csücsülni, mégpedig az adott ember elsődleges kulcsával megegyező nevű/számú alkönyvtárban, vagyis a file-t nem adatbázisban tárolom

és azért kell session, mert az adatokat -- név, cím stb. meg kellene őrizni, h ne kelljen újra beírnia ha csak a file kiterjesztése nem jó

olyan megoldást akarok:
kitölti az adatokat -- ezeket validate fvénnyel leellenőrzöm
file kiterjesztés ellenőrzése submit fvényen belül történik
vagyis ha nem megfelelő a kiterjesztés akkor vissza kiadok egy üzit, ugyanakkor a form elemek és a file feltöltése előtt már felvitt adatok ne tűnjenek el (bár mentésük az adatbázisba csak akkor történik meg ha minden érték még a file típus is megfelelő)

submit fvényem:

letárolom a session változókba a form értékeket
utána megvizsgálom a file kiterjesztést -- ha jó akkor mentem a file-t és az adatokat az adatbázisba és a session változók értékeit törlöm
-- avagy ha nem jó a kiterjesztés, akkor újra visszaadom a formot, h újra tudjon file-t csatolni, de felvitt értékek (cím, név stb.)
már azért ki legyenek töltve

ezt szeretném ill fogom

ha van ötleted?

0
0

mini

sgabe képe

Azzal a megoldással egészen addig elérhető marad a bevitt adat, amíg nem törlöd. Inkább arra lettem volna kíváncsi, hogy a saját modulodon belül megvalósítasz-e egy jelentkező tartalom típust, aztán a jelentkezésekkel ilyen-olyan műveleteket hajtasz-e végre az oldalon belül. Ha csak egy adatbázisba be akarod tolni az adatokat, akkor jó lehet a fentebb vázolt megoldás, de ha node objektumokról beszélünk, akkor máshogy csinálnám.

0
0
lili_ képe

nem lesz saját node típus

0
0

mini

aboros képe

filefield modul miért nem jó arra, hogy feltöltést adj a tartalom típusodhoz? még csak nem is a modulod hozta létre a tartalom típust. simán a cckval egy filefield mező miért nem jó? mindent tud amit akarsz, célkönyvtárat, még file átnevezési szabályt is megadhatsz ha fielfeild_path is van és korlátozhatod a feltölthető fileok típusát is. ő meg validál, másol, átnevez, végzi a dolgát.

0
0

-
clear: both;

lili_ képe

mert saját modul keretében hozok létre saját formot, és nem lesz saját tartalom típusom de ezt írtam fent, és nem szoktam bűvészkedni :)

0
0

mini