Ubercart: problema di upload dei file associati ai prodotti
Salve a tutti,
sto configurando un sito con drupal 7.26 ed ubercart 3.6 (server altervista - www.digitalfiles.it - Cloak con Path Forwarding)
Ho bisogno di inserire dei files per il download di prodotti digitali.
Una volta creato il prodotto tento di inserire il file per il download ma mi esce questo:
Warning: copy() [function.copy]: Unable to access temporary://AWPCP_0.pot in uc_file_admin_files_form_action_submit() (line 429 of /membri2/encrimi/sites/all/modules/ubercart/uc_file/uc_file.admin.inc).
Messaggio di stato Si è verificato un errore durante la copia del file in privati/downloads/
Risultato il file si carica in tmp ma non viene poi copiato nella directory di destinazione (dalle prove effettuate: se inserisco un file manualmente nella directory di destinazione lo vedo e lo posso cancellare ). L'inserimento delle immagini funziona regolarmente.
L'errore viene visualizzato anche se creo una tmp sulla root.
Inoltre nella visualizzazione file da scaricare da parte del cliente in una prova fatta con un file caricato manualmente sul server mi appare questo:
Notice: Undefined property: stdClass::$addresses in _uc_file_log_download() (line 423 of /membri2/encrimi/sites/all/modules/ubercart/uc_file/uc_file.pages.inc).
Warning: in_array() expects parameter 2 to be array, null given in _uc_file_log_download() (line 424 of /membri2/encrimi/sites/all/modules/ubercart/uc_file/uc_file.pages.inc).
Notice: Undefined property: stdClass::$fuid in drupal_write_record() (line 7188 of /membri2/encrimi/includes/common.inc).
Ho cercato dappertutto ma non sono riuscito a trovare una soluzione al problema. Tutte le informazioni che ho trovato fanno riferimento al safe mode od a fantomatici codici da aggiungere a .htaccess che per la verità non ho neppure provato a modificare ( sarebbe una perdita di tempo e basta )nonchè al cambiamento dei permessi cartella a 777 ( altra perdita di tempo). Ora, posto che le impostazioni safe mode sono più che ovvie in un server condiviso, chiedo:
1. qualcuno può gentilmente consigliarmi un modo per risolvere la questione?
2. è per caso disponibile una patch di cui io non sono a conoscenza o che non sono riuscito a trovare?
Nella speranza di poter risolvere, perchè in caso contrario resterei veramente bloccato vanificando il lavoro fatto sino ad ora, ringrazio anticipatamente per le risposte.

Risposte
Avevo delle prove da
Avevo delle prove da consigliarti, ma poi ho letto che sono solo perdite di tempo, quindi ho paura che dovrai rimanere con il tuo problema, salvando però del preziosissimo tempo...
Amico mio ( anche se non lo
Amico mio ( anche se non lo sei ) questa risposta te la potevi anche tenere per te! non ho certo bisogno di sarcasmo del piffero specie mentre sto lavorando.
Detto questo se i tuoi consigli sono relativi al cambiamento da safe mode on a off come detto sono una perdita di tempo perchè non si può fare (almeno con il server di altervista), per quanto concerne invece i cambiamenti di permessi ho provato ma niente ( e qui la perdita di tempo c'è stata realmente ) e comunque non è certo una soluzione proponibile per un sito di produzione mettere una cartella per il download dei files che devi vendere a 777.
Per il resto ho sempre da imparare ( come tutti del resto ).
Prova con i "fantomatici
Prova con i "fantomatici codici da inserire in .htaccess" e comunque, se devi fare un e-commerce, la soluzione "economica" di altervista non è la soluzione professionale, detto ciò, non ho tempo da perdere nemmeno io dietro uno come te, specie quando sto lavorando, alla fine il problema è tuo, mica mio, e questo è un forum non il centro assistenza tecnica Drupal + Ubercart!
Appunto non hai tempo da
Appunto non hai tempo da perdere quindi per favore lascia spazio a chi ne sa più di te e magari è più gentile ed educato.
-------------
Chiedo scusa a tutto il forum dello spettacolino di post poco edificante dato qui sopra.. purtroppo di mister so tutto io l'Italia ne è piena, saccenza e supponenza la fanno da padrone, alle volte non se ne può più e si risponde per le rime alla tracotanza.
Nella speranza di trovare degna persona disposta a darmi qualche consiglio o che magari ha già risolto lo stesso problema rinnovo la mia richiesta di aiuto.
Post riattivato perchè non
Post riattivato perchè non considerabile spam.
Se l'upload delle immagini
Se l'upload delle immagini funziona prova a vedere se è possibile utilizzare al posto della funzione copy la funzione move_uploaded_file (http://it1.php.net/move_uploaded_file) all'interno della funzione uc_file_admin_files_form_action_submit.
Grazie mille stasera mi metto
Grazie mille stasera mi metto subito al lavoro e poi riferisco... ancora grazie
Spulciando la documentazione
Spulciando la documentazione delle api di Drupal credo che il problema sia causato dall'utilizzo di stream (temporary, public, private) se associato al safe mode attivo. Esiste un wrapper per copy() che cerca di generare un workaround per questo problema file_unmanaged_copy(). Vedi tutta la documentazione qui https://api.drupal.org/api/drupal/includes!file.inc/function/file_unmanaged_copy/7, in cui si legge
Spero ti aiuti a risolvere!
@ blackice78 ho fatto alcune
@ blackice78
ho fatto alcune prove, innanzitutto ho cambiato
// Copy the file to its final location.
if (copy($file_object->uri, $dir . '/' . $file_object->filename)) {
// Check if any hook_uc_file_action('upload', $args) are implemented
foreach (module_implements('uc_file_action') as $module) {
$name = $module . '_uc_file_action';
$result = $name('upload', array('file_object' => $file_object, 'form_id' => $form_id, 'form_state' => $form_state));
}
con
if (move_uploaded_file($file_object->uri, $dir . '/' . $file_object->filename).......
ho semplicemente sostituito copy con questa lasciando invariato il resto il problema della temporary è scomparso essendo la funzione move_uploadd_file non influenzata dal safe mode resta però la questione del
Messaggio di stato Si è verificato un errore durante la copia del file in privati/downloads/ (ora ho eliminato privati e lasciato solo downloads)
si è riproposta ed il file comunque non viene spostato. A questo punto ho il sentore che i problemi siano due.
Nella finestra di caricamento dei files all'inizio c'è la dicitura cartella e sotto un piccolo menu a discesa dove probabilmente viene selezionata ( o resa di default ) la directory dove poter fare l'upload dei file.
Sotto la casella appare la seguente dicitura: The directory on the server where the file should be put. The default directory is the root of the file downloads directory.
Ebbene in questo piccolo menu a discesa l'unica selezionabile è " / " (non so se questo possa essere rilevante ma mi sarei aspettato magari " downloads/ " cioè la directory da me scelta per l'upload dei files).
Per ciò che concerne la funzione file_unmanaged_copy() ( l'ho guardata e la reputo a dir poco geniale) è già ricompresa e definita in file.inc di drupal e, sinceramente, non so come potrei richiamarla al posto di copy senza generare errore ( non ho l'esperienza necessaria).
Per quanto riguarda l'ultimo errore forse ( ma ribadisco forse) dipende dal fatto che caricando i file sulla tmp andavo poi a cancellarli direttamente dal server senza lanciare il cron e pertanto andando a ricaricare il medesimo file successivamente si creava un doppione nella tabella file_managed.
Ti ringrazio sentitamente per una tua risposta.
Per poter utilizzare
Per poter utilizzare file_unmanaged_copy, se la funzione non è disponibile al momento della chiamata, puoi includere il modulo di gestione file con module_load_include inserendo qualcosa come:
<?phpmodule_load_include('inc', 'file', 'file');
?>
prima della chiamata alla funzione.
Allora ho inserito il
Allora ho inserito il module_load_include il codice attuale è:
// Retrieve our uploaded file.
$file_object = $form_state['storage']['temp_file'];
module_load_include('inc', 'file', 'file');
// Copy the file to its final location.
if (file_unmanaged_copy($file_object->uri, $dir . '/' . $file_object->filename)) {......
purtroppo il risultato non è cambiato rispetto al move_uploaded_file e cioè non da più errore in relazione alla temporary ma non copia il file. nei log trovo solo questo:
The specified file temporary://cavalli.jpg could not be copied to downloads//cavalli.jpg.
Ora non so se devo settare diversamente i parametri della funzione però a me pare funzioni, non mi capacito del fatto che non copia il file. Poi una stranezza ( sempre se lo è ) è la doppia // tra la directory downloads e il file cavalli come mostrato nel log. Ho fatto la prova eliminando
. '/' . risultando quindi
if (file_unmanaged_copy($file_object->uri, $dir . $file_object->filename))
e caricando un altro file. Il risultato dal log è il seguente:
The specified file temporary://AWPCP-it_IT.mo could not be copied to downloads/AWPCP-it_IT.mo.
il percorso adesso mi sembra corretto ma continua a non copiare. Probabilmente sbaglio qualcosa ma non so cosa.
Sarebbe bello poterci trovare una dritta perchè oltre a me permetterebbe di far funzionare sto benedetto upload a tutti quelli che non hanno la possibilità di spegnere il safe mode.
Il doppio slash può darsi
Il doppio slash può darsi dipenda dal fatto che l'impostazione della directory di download non abbia bisogno dello slash finale. Dato che le immagini vengono caricate correttamente e non riscontri più il problema per l'uso degli stream, prova a impostare la directory a qualcosa come "sites/default/files/download" o comunque interna al tuo filesystem (non creare la directory a mano, se tutto ok credo venga generata in auto con i giusti permessi).
Sì in realtà io lo slash
Sì in realtà io lo slash finale non l'avevo messo ecco perchè mi parevano strani i due slash infatti facendo una prova ho messo la directory con lo slash e poi nel log ne sono venuti fuori tre.
La directory di upload file dei prodotti si setta nella configurazione prodotto e non nel file system di drupal quindi li inserirò la stessa directory pubblica inserita nel file system e cioè sites/default/files e vediamo se copia il file poi penserò eventualmente ad indicarne una apposita per i downloads. Mi sta vendo un dubbio : la funzione di ubercart se hai occasione di guardare il file uc_file_admin mi sembra che faccia alcune cose che fa la funzione file_unmanadeg copy non è che percaso gli stiamo dicendo di fare la cosa due volte? Prendi ad esempio il settaggio dei permessi cartella lo ritrovi sia nella funzione originaria di ubercart che in file_unmanaged_copy.
Stasera provo.
Update: per la curiosità ho provato subito ma niente
Si è verificato un errore durante la copia del file in sites/default/files/
Update2: provando invece con sites/default/files/downloads
sites/default/files/downloads non è un file valido o una cartella valida.
Update3: ho fatto questa piccola modifica al codice
// Retrieve our uploaded file.
$file_object = $form_state['storage']['temp_file'];
module_load_include('inc', 'file', 'file');
$source = $file_object->uri;
$pathdelfile = $dir . '/' . $file_object->filename;
// Copy the file to its final location.
if (file_unmanaged_copy($source, $pathdelfile, FILE_EXISTS_RENAME)) {........
Adesso non mi da più il messaggio errore durante la copia, bensì
Non è possibile muovere il file in downloads/
Vedi anche
Vedi anche https://bugs.php.net/bug.php?id=60456. Mi sembra si parli specificamente di questo problema e ci sono degli allegati con dei test da effettuare. Se la copia del file non riesce nemmeno nei casi in cui dovrebbe funzionare, proverei a concentrarmi sui permessi della directory di destinazione.
Nonostante i vari tentativi
Nonostante i vari tentativi di creare un aggiramento del codice non sono riuscito nell'intento. Non ritengo a questo punto che Ubercart sia ottimale per la versione 7.26. Sono passato a Drupal Commerce che fino ad ora non ha dato particolari problemi rispetto ad Ubercart e funziona perfettamente, almeno sino ad ora, su Altervista.
Piccola informazione per chi non lo sapesse:
Per lavorare con la vendita di file digitali con Drupal Commerce è necessaria l'installazione di un modulo aggiuntivo : Commerce_File
Il predetto modulo non è compatibile con la versione 7.x.1.x del modulo Media in quanto lo stesso contiene una versione del modulo File_Entity che non riesce a lavorare con Commerce_File ( in realtà è proprio questo il modulo non compatibile).
E' pertanto necessario installare la versione 7.x.2.x di Media ( che non contiene File_Entity ) e separatamente File_Entity.
Ringrazio blackice78 per le gentilissime risposte e per l'attenzione dedicata.