multiples - subir, mostrar, modificar y eliminar una imagen en mysql desde php
Subir DOC o PDF utilizando PHP (7)
Puedo subir imágenes bien, pero cuando cambio los tipos de imagen / jpg, imagen / gif a aplicación / msword y aplicación / pdf, no funciona. Aquí está mi código. El mismo código exacto funciona para las imágenes, pero para cargar documentos y pdf, genera un "Archivo no válido". ¿Que está pasando aqui? Mi archivo solo tiene aproximadamente 30kb y está muy por debajo del límite de tamaño de archivo aquí.
$allowedExts = array("pdf", "doc", "docx");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ( ( ($_FILES["file"]["type"] == "application/msword") || ($_FILES["file"]["type"] == "text/pdf") )
&& ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
}
else
{
echo "Invalid file."
}
Agregue los tipos de mimo correctos a su código, al menos estos:
.jpeg -> image/jpeg
.gif -> image/gif
.png -> image/png
Una lista de tipos mime se puede encontrar here .
Además, simplifique la lógica del código e informe un número de error para ayudar a que el soporte de primer nivel encuentre los problemas:
$allowedExts = array(
"pdf",
"doc",
"docx"
);
$allowedMimeTypes = array(
''application/msword'',
''text/pdf'',
''image/gif'',
''image/jpeg'',
''image/png''
);
$extension = end(explode(".", $_FILES["file"]["name"]));
if ( 20000 < $_FILES["file"]["size"] ) {
die( ''Please provide a smaller file [E/1].'' );
}
if ( ! ( in_array($extension, $allowedExts ) ) ) {
die(''Please provide another file type [E/2].'');
}
if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) )
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
}
else
{
die(''Please provide another file type [E/3].'');
}
No use el parámetro [''type'']
para validar las subidas. Ese campo es proporcionado por el usuario y puede ser falsificado de manera trivial, lo que permite cargar CUALQUIER tipo de archivo. Lo mismo ocurre con el parámetro [''name'']
, que es el nombre del archivo provisto por el usuario. También es trivial forjar, por lo que el usuario envía nastyvirus.exe
y lo llama cutekittens.jpg
.
El método adecuado para validar las cargas es usar la determinación del tipo mime del lado del servidor, por ejemplo, a través de la información de fileinfo , además de tener una correcta verificación de carga correcta, que no:
if ($_FILES[''file''][''error''] !== UPLOAD_ERR_OK) {
die("Upload failed with error " . $_FILES[''file''][''error'']);
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES[''file''][''tmp_name'']);
$ok = false;
switch ($mime) {
case ''image/jpeg'':
case ''application/pdf''
case etc....
$ok = true;
default:
die("Unknown/not permitted file type");
}
move_uploaded_file(...);
También está utilizando el nombre de archivo proporcionado por el usuario como parte del destino final de los archivos move_uploaded_files. también es trivial incrustar los datos de ruta en ese nombre de archivo, que luego utilizas a ciegas. Eso significa que un usuario remoto malintencionado puede hacer garabatos en CUALQUIER archivo en su servidor para el cual conoce la ruta, además de plantar nuevos archivos.
Para application / msword y application / vnd.ms-excel, cuando eliminé la restricción de tamaño:
($_FILES["file"]["size"] < 20000)
... funcionó bien.
Puedes usar
$_FILES[''filename''][''error''];
Si ocurre algún tipo de error, devuelve ''error''; de lo contrario, 1,2,3,4 o 1 si se hace
1: si el tamaño del archivo está por encima del límite ... Puede encontrar otras opciones buscando en Google
Una de tus condiciones está fallando. Compruebe el valor de mime-type para sus archivos.
Trate de usar la aplicación / pdf, no texto / pdf. Consulte el tipo de medio MIME adecuado para archivos PDF
<?php
//create table
/*
--
-- Database: `mydb`
--
-- --------------------------------------------------------
--
-- Table structure for table `tbl_user_data`
--
CREATE TABLE `tbl_user_data` (
`attachment_id` int(11) NOT NULL,
`attachment` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `tbl_user_data`
--
ALTER TABLE `tbl_user_data`
ADD PRIMARY KEY (`attachment_id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `tbl_user_data`
--
ALTER TABLE `tbl_user_data`
MODIFY `attachment_id` int(11) NOT NULL AUTO_INCREMENT;
*/
$servername = "localhost";
$username = "root";
$password = "";
// Create connection
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(isset($_POST[''submit''])){
$fileName=$_FILES["resume"]["name"];
$fileSize=$_FILES["resume"]["size"]/1024;
$fileType=$_FILES["resume"]["type"];
$fileTmpName=$_FILES["resume"]["tmp_name"];
$statusMsg = '''';
$random=rand(1111,9999);
$newFileName=$random.$fileName;
//file upload path
$targetDir = "resumeUpload/";
$fileName = basename($_FILES["resume"]["name"]);
$targetFilePath = $targetDir . $newFileName;
$fileType = pathinfo($targetFilePath,PATHINFO_EXTENSION);
if(!empty($_FILES["resume"]["name"])) {
//allow certain file formats
//$allowTypes = array(''jpg'',''png'',''jpeg'',''gif'',''pdf'',''docx'',''doc'');
$allowTypes = array(''pdf'',''docx'',''doc'');
if(in_array($fileType, $allowTypes)){
//upload file to server
if(move_uploaded_file($_FILES["resume"]["tmp_name"], $targetFilePath)){
$statusMsg = "The file ".$fileName. " has been uploaded.";
}else{
$statusMsg = "Sorry, there was an error uploading your file.";
}
}else{
$statusMsg = ''Sorry, only DOC,DOCX, & PDF files are allowed to upload.'';
}
}else{
$statusMsg = ''Please select a file to upload.'';
}
//display status message
echo $statusMsg;
$sql="INSERT INTO `tbl_user_data` (`attachment_id`, `attachment`) VALUES
(''NULL'', ''$newFileName'')";
if (mysqli_query($conn, $sql)) {
$last_id = mysqli_insert_id($conn);
echo "upload success";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
}
?>
<form id="frm_upload" action="" method="post" enctype="multipart/form-data">
Upload Resume:<input type="file" name="resume" id="resume">
<button type="submit" name="submit">Apply Now</button>
</form>
//output sample[![check here for sample output][1]][1]
$folder = "Resume/";
$temp = explode(".", $_FILES["uploaded"]["name"]);
$newfilename = round(microtime(true)).''.''. end($temp);
$db_path ="$folder".$newfilename ;
//remove the .
$listtype = array(
''.doc''=>''application/msword'',
''.docx''=>''application/vnd.openxmlformats-officedocument.wordprocessingml.document'',
''.rtf''=>''application/rtf'',
''.pdf''=>''application/pdf'');
if ( is_uploaded_file( $_FILES[''uploaded''][''tmp_name''] ) )
{
if($key = array_search($_FILES[''uploaded''][''type''],$listtype))
{if (move_uploaded_file($_FILES[''uploaded''] [''tmp_name''],"$folder".$newfilename))
{
include(''connection.php'');
$sql ="INSERT INTO tb_upload
(filePath) VALUES (''$db_path'')";
}
}
else
{
echo "File Type Should Be .Docx or .Pdf or .Rtf Or .Doc";
}