PHP - Error en upload de archivos

 
Vista:
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 11/04/2019 22:46:06
Hola de nuevo.

Anteriormente hice una publicación ya que necesito ayuda con un código, pero el código estaba con algunos errores que podía solucionar y que quizá incomodaban al tratar de ayudarme.
Ahora los he solucionado y aún sigo con uno de ellos.
Pues bien, trato de hacer un upload y que el filename se guarde en una DB.

He conseguido guardar el comentario, seleccionar carpeta de destino, etcétera. Incluso el nombre del archivo se guarda en la DB. Todo genial hasta ahí, pero no consigo que el archivo en sí, se guarde al directorio.

He aquí el código. Muchas gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
session_start();
 
include "../config/config.php";
 
//print_r($_SESSION);
if(!empty($_POST) && isset($_SESSION["user_id"])){
 
	$alphabeth ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ1234567890_-";
	$code = "";
	for($i=0;$i<12;$i++){
	    $code .= $alphabeth[rand(0,strlen($alphabeth)-1)];
	}
 
	$code= $code;
	$is_public = isset($_POST["is_public"])?1:0;
	$folder_id = $_POST["folder_id"]!="" ? $_POST["folder_id"]:"NULL";
	$folder_id;
 
	$user_id=$_SESSION["user_id"];
	$description = $_POST["description"];
	$created_at = "NOW()";
	$sql = "INSERT INTO file (code, filename, description, is_public, user_id, is_folder, folder_id, created_at) VALUES (\"$code\",\"$filename\",\"$description\", $is_public, $user_id, 0, $folder_id, NOW());";
 
	$query=mysqli_query($con, $sql);
	if ($query) {
		// echo "archivo agregado con exito";
		// $success=sha1(md5("exito"));
		header("location: ../newfile.php?success");
	}else{
		// echo "no se pudo, subir hubo un error".mysqli_error($con)."<br>.".mysqli_errno($con);
 
		header("location: ../newfile.php?error");
	}
 
}
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 11/04/2019 22:58:39
Una vez más perdonen mi terquedad. Puse mal el código.

Era este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
	session_start();
 
	include "../config/config.php";
 
	//print_r($_SESSION);
if(!empty($_POST) && isset($_SESSION["user_id"])){
 
	$alphabeth ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ1234567890_-";
	$code = "";
	for($i=0;$i<12;$i++){
	    $code .= $alphabeth[rand(0,strlen($alphabeth)-1)];
	}
 
	$code= $code;
	$is_public = isset($_POST["is_public"])?1:0;
	$folder_id = $_POST["folder_id"]!="" ? $_POST["folder_id"]:"NULL";
	$folder_id;
	$created_at = "NOW()";
	$user_id=$_SESSION["user_id"];
	$description = $_POST["description"];
	$path = "../storage/data/".$_SESSION["user_id"];
	$filename = basename($_FILES["filename"]["name"]);
	$path2 = $path . $filename;
	$filetype = pathinfo($path2, PATHINFO_EXTENSION);
	if(isset($_POST["subir"]) && !empty($_FILES["filename"]["name"])){
		//Permitir formatos
		$formatos = array('jpg','png','jpeg','gif','pdf','exe','apk','xml','html','php','css','mp3','mp4','3gp','sql','js');
		if(in_array($filetype, $formatos)){
			if(in_array($filetype, $formatos)){
$sql = "INSERT INTO file (code, filename, description, is_public, user_id, is_folder, folder_id, created_at) VALUES (\"$code\",\"$filename\",\"$description\", $is_public, $user_id, 0, $folder_id, NOW());";
 
}
		$query=mysqli_query($con, $sql);
		if ($query) {
			// echo "archivo agregado con exito";
			// $success=sha1(md5("exito"));
			header("location: ../newfile.php?success");
		}else{
			// echo "no se pudo, subir hubo un error".mysqli_error($con)."<br>.".mysqli_errno($con);
 
			header("location: ../newfile.php?error");
		}
}
}
}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por Marlon (15 intervenciones) el 11/04/2019 23:06:12
si te ayuda este pedazo yo guardé unas imagenes asi

1
2
if (move_uploaded_file($_FILES["file"]["tmp_name"],  "rutacarpeta/".$_FILES['filename']['name'])) {
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 12/04/2019 00:10:28
Intenté con ese y tampoco sube el archivo al directorio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por Marlon (15 intervenciones) el 12/04/2019 00:44:38
pruebe asi

1
2
3
4
5
6
7
8
$temporal = $_FILES["filename"]["tmp_name"];
$image = getimagesize($temporal);
$ancho_original = $image[0];
$alto_original = $image[1];
$original = @imagecreatefromjpeg($temporal);
$copia = @imagecreatetruecolor($ancho_original , $alto_original );
imagecopyresampled($copia, $original, 0, 0,0,0, $ancho_original , $alto_original ,$ancho_original , $alto_original);
imagejpeg($copia,"ruta".$_FILES['filename']['name']."",100);

ojala y te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por italo_pm (193 intervenciones) el 12/04/2019 14:28:47
Hola, yo empezaria simplemente con el move_uploaded_file, luego que funcione pasaria a la query, cuando haria la query la probaria primero en mysql, si funciona haria un echo del insert para ver como lo resuelve, si funciona, recien haria ambas cosas...

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 13/04/2019 04:04:52
Hola, italo_pm, estaba revisando mi código y acabé solucionando los problemas pero tengo una última duda.

Estaba viendo que al subir el archivo, todo se realiza bien y se inserta en la base de datos, pero al resubir el mismo archivo se me duplica en la base de datos y me reemplaza el archivo anterior, lo cual me guarda dos espacios en la base para un solo archivo, y quiero evitar eso de forma en que al subir otra vez el mismo archivo se guarde con otro nombre. Si el primer archivo se llamaba imagen.png el segundo se llame imagen_1.png
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por italo_pm (193 intervenciones) el 13/04/2019 10:11:47
Hola

dices que acabaste solucionando los problemas, o sea que el codigo ha cambiado (respecto a tus respuestas anteriores), lo mejor seria que escribieras el codigo que ya te funciona para poder ayudarte.

por otra parte, no entiendo esto:

1
pero al resubir el mismo archivo se me duplica en la base de datos

mientras que en tu codigo tienes (en el antiguo talvez a cambiado):

1
$sql = "INSERT INTO file (code, filename, description, is_public, user_id, is_folder, folder_id, created_at) VALUES (\"$code\",\"$filename\",\"$description\", $is_public, $user_id, 0, $folder_id, NOW());";

tienes un insert, a nivel de database implicaria que es un nuevo record, por ende no se duplica.

1
y me reemplaza el archivo anterior,

en que sentido lo remplaza?? en el database o en el carpeta fisicamente?

1
lo cual me guarda dos espacios en la base para un solo archivo,

y aqui regresa mi duda, dos espacios es decir tienes un array o te refieres a dos records?

tampoco veo en el codigo que realizes por alguna parte el upload del file en una carpeta.



la solucion a tu problema en una linea?

1
$filename = $code."_".basename($_FILES["filename"]["name"]);

y ya no se duplicaran, ni en tu database ni en tu carpeta.

prueba en test.

si no es eso a lo que te referias y necesitas ayuda, expon mejor tu problema y escribe el codigo.

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 13/04/2019 16:22:48
Hola, italo. Gracias por tu ayuda.
Explicaré mejor el tema.

En el punto número uno es lo siguiente:
Suponiendo que un usuario nuevo registra, él sube un archivo. Antes de subir el archivo realizo un:

1
2
3
4
5
$path = "../storage/data/".$_SESSION["user_id"]."/";
if (is_dir(path)) {
} else{
	mkdir($path,0700);
}

Ya creada la carpeta del usuario, procedo a subir el archivo (ejemplo.jpg) y a asociarlo a la base de datos, con:

1
2
3
4
if(isset($_POST["subir"]) && !empty($_FILES["filename"]["name"])){
if(move_uploaded_file ($_FILES['filename']['tmp_name'], $path2)) {
 
$sql = "INSERT INTO file (code, filename, description, is_public, user_id, is_folder, folder_id, created_at) VALUES (\"$code\",\"$filename\",\"$description\", $is_public, $user_id, 0, $folder_id, NOW());";

El archivo se sube exitosamente, de igual manera se agrega a la base de datos sin ningún problema.
Pero acá el problema. Como ya subí el archivo ejemplo.jpg y ya está dentro de la base de datos, cuando yo vuelvo a subir el mismo archivo, o subo otro con el mismo nombre sucede lo siguiente:

1. En la carpeta de archivos, se toma el ejemplo.jpg antiguo y se sustituye por el nuevo ejemplo.jpg
2. En la base de datos se guardan dos valores, los cuales ambos tienen ejemplo.jpg
2.1 Al suceder eso en la base de datos, cuando extraigo la lista de archivos con SELECT, se me extrae dos veces el ejemplo.jpg ya que fue subido dos veces.

Para solucionar ese problema, quisiera que si ejemplo.jpg ya existe, renombrar el último archivo subido a ejemplo_1.jpg y si vuelve a subirse, ejemplo_2.jpg tanto en la carpeta como en la base de datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por italo_pm (193 intervenciones) el 13/04/2019 18:18:39
hola, el problema esta en la solucion a tu problema que propones, yo personalmente no le encuentro funcionalidad.

se me ocurren dos soluciones rapidas, la prima y mas ineficiente es, si cada ususario al momento que se registra y sube un file tiene su carpeta, podrias hacer que cada vez que suba un juevo file, antes del upload, realizas el move de todos los files en una carpeta (dentro de la carpeta del usuario) que se llama old por ejemplo y solo luego haces el upload del nuevo file.

la segunda es: normalizar el file, de que manera? la que tiene mas sentido:

antes de hacer el upload, al file lo renombras con el nombre file del usuario, lo unes al codigo, mas el username del usuario, mas fecha y hora. de esa manera el file es univoco sea en cualquiera de las carpetas y en database.

tercera: unir la primera y segunda idea.

asi no tendras dolores de cabeza.

piensalo y prueba.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 30
Ha aumentado su posición en 9 puestos en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por César (11 intervenciones) el 13/04/2019 21:00:40
Lo de unir el código y la fecha me gusta para poder hacer que el nombre de archivo sea único, así no se repetirían los nombres. El problema es que cuando el usuario busque su archivo va estar con un nombre casi imposible de encontrar, lo cual dificulta al usuario conseguirlo entre sus tantos archivos. En cambio, si el usuario contiene sus archivos tal como los ha subido, le es más fácil encontrarlos.
Cuando en una computadora o celular copiamos un archivo en una ruta, y este ya existe, nos pregunta si queremos sustituirlo, omitirlo o renombrar y automáticamente añade un [1] (ejemplo[1].jpg) lo cual es la función que me ayudaría.

Me gusta mucho la solución que me das con unir el código o la fecha, pero hagamos una simulación sin código, sólo como una suposición:

1. Usuario sube el archivo file.txt
2. PHP lo renombra a file{codigo}.txt
3. Cuando Usuario va a su lista de archivos encuentra todos sus archivos algo así:

file273923hwrjdh.txt
foto_de_graduacion781436193yeqhd.jpg
cancion3847983hjdh.mp3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Error en upload de archivos

Publicado por italo_pm (193 intervenciones) el 14/04/2019 01:02:34
hola

pero eso no lo habias expuesto como problema, solo has escrito que necesitabas hacer el insert, luego el problema de los nombres duplicados, ahora cuando el usuario va a su lista de files....

antes del codigo, expob que lo deseas, ques lo que tienes actualmente y que es lo que deseas obtener.

rápidamente te puedo decir que sea la solucion que tomes, deberas normalizar los files, incluso le añadiria el id del record, tu razonamiento es equivocadoz recuerda que eres tu que cosa y como la vera el usuario...

si tu guardas el file con nombre:

id_code_nombrefileusuario_fecha_hora.txt

lo estas normalizando, una vez que lo muestre en un elenco o lo que fuere tranquilamente puedes hacer ver solo el nombre del file (nombrefileusuario.txt) lo demas el usuario ni lo veria.

no confundas las tecnologia, por ejemplo abre tu ftp y trata de hacer el upload de un file con el mismo nombre, la unica opcion que te dara es sobreescribirlo o anular la operacion.

por cual razon le vas a complicar la vida sl usuario y a ti mismo con otras opciones??

el rename del file lo haras en otra seccion o cuando vea el elenco de sus files...

concentrate en un problema a la vez y mas aun decide antes de pensar al codigo como haras todas esas cosas, no durante.

salud2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar