2010-09-03 11 views
8

Ho un modulo in cui un amministratore carica tre immagini con dimensioni diverse su tre diverse directory designate. ora per assicurarmi di non entrare nel problema dei nomi di file duplicati ho implementato qualcosa come il php confronterà il nome del file caricato e controllerà se quel nome di file esiste nella directory designata se sì allora echeggerà un errore e ferma l'esecuzione dello script.Nome file PHP

Ora uno dei miei amici mi ha suggerito che è molto brutto chiedere all'amministratore di rinominare manualmente il file immagine e chiedergli di occuparsi del problema della duplicazione dei file. la soluzione che suggeriva era di rinominare automaticamente il file e quindi memorizzarlo nel database e quindi indirizzarlo alla directory.

Sono confuso su quale combinazione devo dare al file rinominato e anche fare in modo che rimarrà nome di file univoco per essere più precisi vorrei farvi capire la mia struttura di directory

come ho detto non ci sarà tre immagini file l'amministratore sarà caricando cioè

a) Titolo Immagine b) breve quadro c) Immagine del particolare

e tutte e tre le file di immagine sarà essere spostati nella rispettiva directory, come l'immagine del titolo nella directory dei titoli e così via.

sto usando lo script di sotto attualmente solo per spostare e memorizzare il nome del file con percorso utilizzando varchar nel database.

$ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"]; 
$ns_pic_title_name = $_FILES["ns_pic_title"]["name"]; 
move_uploaded_file($ns_pic_title_loc, $ns_title_target.$ns_pic_title_name) or die(mysql_error()); 

che è solo il codice di esempio che non ha incluso la funzione di convalida che sto usando. stavo pensando come voglio rinominare tutti i file come

a) Nella directory del titolo il file deve essere memorizzato come. title_1.jpg title_2.jpg title_3.jpg title_4.jpg

e così via

e allo stesso modo per resto delle immagini. Come lo faccio? che funzione uso per raggiungere il mio obiettivo. e se questo non è il modo migliore per rinominare il file, apprezzerei qualsiasi suggerimento seguito per rinominare il file.

grazie in anticipo

risposta

2

Bene, ecco una possibile soluzione:

  1. Ottenere il nome del file Caricata da $_FILES["ns_pic_title"]["name"] e l'estensione separata o se stiamo parlando solo di file di immagine ottenere il tipo di immagine con getimagesize($_FILES["ns_pic_title"]["tmp_name"]);
  2. Controllare il database per l'id massima delle registrazioni di immagini e rendere il la $file_name variabile 'title_'.($max_id + 1)
  3. A questo punto si dovrebbe avere $ file_name e $ FILE_EXTENSION così fanno move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)

Speriamo che questo ha un senso e aiuta .

+0

Questa è un'alternativa migliore al suggerimento del blob mentre si sta ancora utilizzando l'id/chiave primaria dal database. L'ho usato un certo numero di volte. – Treffynnon

+1

sebbene questa sia una buona soluzione, prenderei in considerazione l'utilizzo della funzione tempnam. solo il tipo di funzione che stavo cercando. –

+0

Questo è un buon modo per sincronizzare gli ID dei database e i nomi dei file immagine. Ha una condizione di gara come il suggerimento timestamp nella mia risposta, ma ancora una volta non è un grosso problema in un sito con pochi amministratori che caricano le foto. – Jeff

2

Ci sono un paio di buone opzioni con i vari pro e contro.

  • Uso del tempnam quando si sposta il file, e memorizzare il percorso nel database mysql php. tempnam genera un nome file univoco.

  • Use mysql to store the image content in a blob. In questo modo accederai al contenuto dell'immagine tramite un id invece di un percorso.

+4

Non consiglio davvero di archiviare le immagini del tuo sito nel database. Problemi di prestazioni possono sorgere con il database e inoltre mancherà la memorizzazione nella cache delle immagini. – janosrusiczki

+1

userei la funzione tempnam e sicuramente eviterò di usare blob, ho usato il blob prima e mi sono messo in un problema di prestazioni. +! per aver raccomandato tempnam grazie. –

+0

Sono d'accordo, ho solo aggiunto il suggerimento del blob per completezza. –

2

Invece di dover logica per capire che cosa l'ultimo nome quadro è e calcolare il numero successivo incremento, perché non basta usare PHP's tempnam() function? Genera un nome univoco con un prefisso a tua scelta (ad es. "Titolo", "breve", "dettaglio").Potresti anche semplicemente anteporre un timestamp al nome del file - se non hai un sacco di amministratori che caricano le immagini contemporaneamente, dovrebbe gestire la maggior parte dei conflitti di nome.

Dal momento che le immagini stanno per essere ordinati in title, brief e detail directory già, non è davvero necessario per nominare ogni immagine title_*, brief_*, e detail_*, giusto? Se è nella directory dei titoli, è ovviamente un'immagine del titolo.

Inoltre, inserirai i nomi dei file nel database. Quindi, in altre parti dell'app, quando si desidera visualizzare un'immagine, presumo che si stia ottenendo il nome file corretto dal database. Quindi non è molto importante quale sia il vero nome del file finché l'applicazione sa dove trovarlo. Se questo è corretto, non è necessario avere un nome molto amichevole, quindi un nome di file tempnam() o un timestamp più il nome del file originale sarebbe accettabile.

+0

wow, solo il tipo di funzione che stavo cercando, hai ragione da cima a fondo. adesso sto provando .. grazie mille. –

0

Poiché si memorizzano i riferimenti nel DB, preferirei semplicemente md5 al datetime e utilizzarlo per il nome file e memorizzare anche il nome file del disco nel DB. Non importa quale sia il nome su cui è scritto sul disco, purché sia ​​possibile indicarlo con il nome univoco nel DB.

Io uso questa metodologia e in nessuno dei miei test il nome del disco (md5 dal datetime) richiede sempre più tentativi.