2010-09-03 17 views
8

Tengo un formulario donde un administrador cargará tres imágenes con diferentes dimensiones a tres directorios designados diferentes. ahora para asegurarme de no entrar en el problema de los nombres de archivos duplicados, implementé algo así como que el php comparará el nombre del archivo cargado y comprobará si ese nombre de archivo existe en el directorio designado si es así, se repetirá un error y detener la ejecución del scriptCambio de nombre de archivo PHP

Ahora uno de mis amigos me sugirió que es muy malo pedirle al administrador que cambie manualmente el nombre del archivo de imagen y pidiéndole que se encargue del problema de duplicación de archivos. la solución que sugirió fue cambiar el nombre del archivo automáticamente y luego almacenarlo en la base de datos y luego dirigirlo al directorio.

Me gustaría saber qué combinación debo dar al archivo renombrado y también asegurarse de que seguirá siendo único nombre de archivo para ser más precisos me gustaría que entiendan mi estructura de directorios

como ya he dicho habrá tres archivos de imágenes del administrador será subiendo a saber

a) b Título de imagen) Breve Imagen c) Cuadro del detalle

y todos los tres archivos de imagen se ser movido al directorio respectivo diferente, como la imagen del título va al directorio del título y así sucesivamente.

estoy usando para hacer una secuencia de comandos a continuación solo para mover y almacenar el nombre del archivo con la ruta utilizando varchar en la base de datos.

$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()); 

que es sólo el código de ejemplo no he incluido la función de validación que estoy usando. Estaba pensando que quería cambiar el nombre de todos los archivos como

a) En el directorio de título, el archivo debe almacenarse como. title_1.jpg title_2.jpg title_3.jpg title_4.jpg

y así sucesivamente

y la misma forma de resto de las imágenes. ¿Cómo puedo hacer eso? ¿Qué función utilizo para alcanzar mi objetivo? y si esta no es la mejor manera de cambiar el nombre del archivo, agradecería cualquier sugerencia que se haya seguido para cambiar el nombre del archivo.

gracias de antemano

Respuesta

2

Bueno, he aquí una solución posible:

  1. Obtener el nombre de archivo Subida desde $_FILES["ns_pic_title"]["name"] y extensión separada o si sólo estamos hablando de archivos de imagen Obtener el tipo de imagen con getimagesize($_FILES["ns_pic_title"]["tmp_name"]);
  2. Compruebe su base de datos para la identificación del máximo de los registros de imagen y hacer que el del $file_name variables 'title_'.($max_id + 1)
  3. En este punto, usted debe tener $ nombre_archivo y $ file_extension también lo hacen move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)

Esperamos que esto tiene sentido y ayuda .

+0

Esta es una mejor alternativa a la sugerencia de blob al tiempo que sigue haciendo uso de la clave id/primary de la base de datos. Lo he usado varias veces yo mismo. – Treffynnon

+1

aunque esta es una buena solución, consideraría usar la función tempnam. solo el tipo de función que estaba buscando. –

+0

Esta es una buena forma de sincronizar las identificaciones de base de datos y los nombres de archivo de imagen. Tiene una condición de carrera como la sugerencia de marca de tiempo en mi respuesta, pero una vez más eso no es gran cosa en un sitio con pocos administradores cargando imágenes. – Jeff

2

Hay un par de buenas opciones con diferentes ventajas y desventajas.

  • Uso de tempnam al mover el archivo y almacenar la ruta en la base de datos mysql php. tempnam genera un nombre de archivo único.

  • Use mysql to store the image content in a blob. De esta forma, accederá al contenido de la imagen a través de un id. En lugar de un nombre de ruta.

+4

Realmente no recomiendo almacenar las imágenes de su sitio en la base de datos. Pueden surgir problemas de rendimiento con la base de datos y también le faltará el almacenamiento en caché de las imágenes. – janosrusiczki

+1

usaría la función tempnam y seguramente evitaré usar blob, había usado blob antes y me he metido en un problema de rendimiento. +! para recomendar tempnam gracias. –

+0

Acepto, solo agregué la sugerencia de blob para que esté completa. –

2

En lugar de tener la lógica de averiguar cuál es la última nombre de la imagen y calcular es el siguiente incremento de número, ¿por qué no usar PHP's tempnam() function? Genera un nombre único con un prefijo de su elección (es decir, "título", "breve", "detalle").También podría anteponer una marca de tiempo al nombre del archivo; si no tiene muchos administradores cargando imágenes al mismo tiempo, eso debería manejar la mayoría de los conflictos de nombres.

Desde sus imágenes van a ser ordenados en title, brief y detail directorios ya, en realidad no es necesario nombrar cada imagen title_*, brief_*, y detail_*, ¿verdad? Si está en el directorio del título, obviamente es una imagen de título.

Además, vas a poner los nombres de los archivos en la base de datos. Luego, en otra parte de la aplicación, cuando desee mostrar una imagen, supongo que obtendrá el nombre de archivo correcto de la base de datos. Por lo tanto, no es realmente importante cuál es el nombre real del archivo, siempre y cuando la aplicación sepa dónde encontrarlo. Si eso es correcto, no es necesario tener un nombre muy amigable, por lo tanto, sería aceptable un nombre de archivo tempnam() o una marca de tiempo más el nombre del archivo original.

+0

guau, solo el tipo de función que estaba buscando, tienes razón de arriba a abajo. ahora estoy probándolo ... muchas gracias. –

0

Debido a que está almacenando referencias en la base de datos, preferiría simplemente md5 la fecha y hora y usar eso para el nombre de archivo y también almacenar el nombre de archivo del disco en la base de datos. No importa con qué nombre se escriba en el disco, siempre que pueda señalarlo con el nombre único en el DB.

Uso esta metodología, y en ninguna de mis pruebas el nombre del disco (md5 de la fecha y hora) alguna vez requirió múltiples intentos.

Cuestiones relacionadas