file_save_upload

makgab képe

Hi!

Feltöltés funkciót irnék.
Üzenet:
Biztonsági okokból a feltöltött fájlt át kellett nevezni. Az új név: myfile.tar_.gz.
warning: Invalid argument supplied for foreach() in /var/www/html/drupal/includes/file.inc on line 551.

A fájl a /tmp-be feltöltődik. Hogyan tudom átteni a végleges helyére (pl. sites/default/files)?

G.

<?php
...
$form['download_file'] = array (
  '#type' => 'file',
  '#title' => t('Fájl'),
);
...
 
$filedName = 'download_file';
if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name'][$fieldName])) {
   $file = file_save_upload($fieldName, 'sites/default/files');
   if (!$file) {
      form_set_error($fieldName, 'Error uploading file.');
      return;
    }
}
...
 
?>
Drupal verzió: 
makgab képe

<?php
...
$filedName = 'download_file';
if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name'][$fieldName])) {
   $file = file_save_upload($fieldName, null, 'sites/default/files', false);
   if (!$file) {
      form_set_error($fieldName, 'Error uploading file.');
    } else {
      drupal_set_message('File uploading success.');
    }
}
...
?>
0
0
york képe

Megkernek mindenkit, hogy az itt lathato kodot ne hasznalja es ne vegye mintanak!
A helyes file feltoltesrol dokumentacio itt olvashato: http://drupal.org/node/347251

0
0
makgab képe

Így már jó a kód:

<?php
...
  if ($file != 0) {
    $dest_path = 'upload_directory/$file->filename';
...
?>
0
0
york képe

Nem

0
0
makgab képe

$dest = $upload_dir . '/' . $file->filename;

0
0
york képe

Fogalmad sincs mi a fenti koddal a baj.
Tovabbra is azt mondom, senki ne hasznalja es vegye mintanak.
File feltoltesre mintakodot talal az elozo hozzaszolasomban.

0
0
makgab képe

Áruld el mi a baj vele. Nálam szépen működik.
Azért írtam át azt az egy sort, mert az 'upload_dir/file' stringben a file mi is akar lenni? Nem egészen értem.
Gondoltam a $file változó lenne, de mivel az egy object, csak $file->filename string adja vissza a fájlnevet.

Annak ellenére, hogy működik, mi a rossz benne? Mi az a file?

G.

0
0
york képe

Most melyik kodrol beszelsz?
Mert ha visszanezek a szalra akkor en nem igazan latom, a kodban azt a sort amit emlegetsz.
De ha mukodik akkor hasznald egeszseggel.

0
0
makgab képe

Az általad belinket kód egy része. Erről beszélek:

<?php
...
  if ($file != 0) {
    $dest_path = 'upload_directory/file';
...
?>

Nem igazán világos, hogy mi az a file a 'upload_directory/file'-ban.
Én erre finomítottam csak:

<?php
...
  if ($file != 0) {
    $dest_path = 'upload_directory/' . $file->filename;
    // vagy az én esetemben:
    // $dest_path = $upload_dir . '/' . $file->filename;
...
?>

De tényleg érdekel, hogy miért nem jó, amit én írtam!

G.

0
0
york képe

A kovetkezo problemakat latom:
- nem ertesz a drupalhoz, nem tudod milyen logika szerint epul fel a rendszer
- nem vagy hajlando megtanulni, hiaba adtak doksit
- PHP ismereteid sem eleg melyek a modul irashoz
- az angol se igazan megy

Miert nem olvasod el Gusztav jegyzetet?

0
0
makgab képe

Már ne is haragudj, de azért nem kell bántani a másikat?
- A Drupal-al nemrég kezdtem foglalkozni, nyilván nem vagyok benne profi.
- Honnan tudod, mennyi doksit olvasok/olvastam, olvasom NG jegyzetét! Ma is tanultam belőle 1-2 dolgot.
- PHP-vel elég rég foglalkozom (nem mindennap használom), de nyilván azt sem ismerem teljesen profi szinten.
- Hadd döntsem el hogy egy adott funkcióhoz szeretnék-e modult írni vagy sem. Egyébként jópár modult írtam már.

Ezek szerint, mivel működik is az általam leírt sorral a kód, nem tudom mi lenne benne a hibás.
Az aktuális feladathoz javítottam. Elnézést ha ezzel megzavartam valakit!
Valószínű ez okozhatta a félreértést.

G.

0
0
york képe

Bocs ha megbantottalak nem volt szandekos.
Senki nem mondta, hogy a kezdo nem kerdezhet, de ha javasolnak egy problemara megoldasokat, akkor illik kiprobalni, amit te nem tettel meg, mert ha megtetted volna akkor nem irnal modult.
Mint korabban irtam van aki szereti 25x feltalalni a kereket, csak rajta.

Nem zavartal meg senkit, csak szeretnenk ha a forumot olvasok nem tanulnak es utanoznak a rossz dolgokat.

Az elso kodod nem fogom sorrol sorra vegeg elemezni miert nem jo. A lenyeg az, hogy drupal alatt nem hasznaljuk a $_POST, $_GET, $_FILES valtozokat, hanem a belso API-val vegezzuk el a szukseges feladatokat. A mintakodban jol latszik, hogy kell filet feltolteni http://drupal.org/node/347251 .

A javitgatasod meg ertelmetlen az a valtozo a cel konyvtart tarolja, mint a neve is mutatja. Amit csinaltal azzal minden allomanyod kulon konyvtarba fog kerulni, semmi ertelme.
A drupal API dokumentacioja itt talalhato: http://api.drupal.org
A ket fuggveny doksijat nezd meg hatha igy konnyebben megerted a minta kodot:
- http://api.drupal.org/api/function/file_save_upload/6
- http://api.drupal.org/api/function/file_copy/6

Nem csak a kod lehet hibas hanem a szemlelet is. A Drupal mukodese szamomra nagyon ujszeru es erdekes logika alapjan tortenik, eltartott egy darabig amig megszoktam.

Jo tanulast!

0
0
makgab képe

Éreztem, hogy nem egészen egyről beszélünk, de nem baj.

A Drupal api-jával végzünk mindent.
Az általam először a neten talált hibás felfogású (pl. _FILES változót) kódot már akkor elfelejtettem. Nem is arról beszéltem. A lényeg, hogy kibogoztuk a témát. :)

Van egy kérdésem, de az egy másik thread lesz. :)

G.

0
0
aboros képe

van kiváló filekezelő modul a core ban, upload.module.
van kiváló filekezelő mező cck -hoz, filefield.module.

vannak egészen durva filekezelő modulok is, mint pl az imce vagy a webfm..

ezekkel mi a baj?
amennyi idő alatt ezt a saját "filekezelő modult" összehoztad, annyi alatt már rég elolvashattad volna gusztáv jegyzetében, hogy hogyan kell ezt helyesen megcsinálni core vagy contrib modulokkal.

0
0

-
clear: both;

makgab képe

Azért írtam meg a modult, mert ezzel is gyakorlok.
A NG által írt "Drupal Bibliát" természetesen nyálazom folyamatosan.
Biztos másik modulokkal is meg lehet oldani szuperul, de írtam magamnak célirányosan egy modult (amilyen nekem kell).

A mintát a neten találtam, lehet hogy nem jó. Köszönöm, hogy "javítottátok", thanx york.
Mi a hibája? Csak hogy ebből is tanuljak... :)
Az is_uploaded_file() nem használatos? A Drupal file_copy() célszerűbb?

G.

0
0
makgab képe

<?php
function myform() {
  $form = array();
  // If this #attribute is not present, upload will fail on submit
  $form['#attributes']['enctype'] = 'multipart/form-data';
  $form['file_upload'] = array(
    '#title' => t('Upload file'),
    '#type'  => 'file',
  );
  $form['submit_upload'] = array(
    '#type'  =>  'submit',
    '#value'  =>  'Submit'
  );
  return $form;
}
 
function myform_submit($form, &$form_state) {
  $validators = array();
  $dest = 'upload_directory';
  $file = file_save_upload('file_upload', $validators, $dest);
  //$file will be 0 if the upload doesn't exist, or the $dest directory
  //isn't writable
  if ($file != 0) {
    $dest_path = 'upload_directory/$file->filename';
    $result = file_copy($file, $dest_path, FILE_EXISTS_RENAME);
    if ($result == 1) {
      //Success, $file object will contain a different (renamed)
      //filename and filepath if the destination existed
    }
    else {
      //Failure
    }
  }
  else {
    form_set_error('myform', t("Failed to save the file."));
  }
}
?>
0
0
york képe

Azzal, hogy bemasoltad ide az elobb linkelt kodot meg nem vagy elorebb.
Ilyen esetben azert illek megjelolni a forrast is.
Mindenki arra pazarolja a draga idejet amire akarja... en nem szeretem 25x feltalalni a kereket, valaki meg ezt elvezi.

0
0
makgab képe

bocs, csak a teljesség kedvéért.
helyesen tehát:

<?php
...
if ($file != 0) {
     $dest = 'upload_directory/' . $file->filename; 
...
?>

Mivel a $file egy object, a $file->filename pedig már string.

G.

0
0
balagan képe

És akkor még azt nem is említette senki, hogy $filedName-et deklaráltál, és $fieldName-ként használtad.

0
0
Sk8erPeter képe

Dehát ez egy 2009-es thread... :)

0
0