php - allowed - .mp3 Filetype Upload
mime types (6)
- ¿por qué no utilizar in_array en lugar del bucle foreach para verificación de tipo?
- cuando sube un archivo válido, ¿ha intentado verificar los valores de $ sizeOK & $ typeOK?
Estoy trabajando en un script de carga de PHP que permite la carga de archivos .mp3, entre otros. Creé una matriz que especifica los tipos de archivos permitidos, incluidos los mp3, y establece un límite máximo de carga de 500 MB:
// define a constant for the maximum upload size
define (''MAX_FILE_SIZE'', 5120000);
// create an array of permitted MIME types
$permitted = array(''application/msword'', ''application/pdf'', ''text/plain'', ''text/rtf'', ''image/gif'', ''image/jpeg'', ''image/pjpeg'', ''image/png'', ''image/tiff'', ''application/zip'', ''audio/mpeg'', ''audio/mpeg3'', ''audio/x-mpeg-3'', ''video/mpeg'', ''video/mp4'', ''video/quicktime'', ''video/x-ms-wmv'', ''application/x-rar-compressed'');
Hasta el momento en la prueba, todos los tipos de archivos especificados se han subido correctamente, pero por alguna razón aparece un error para .mp3. Como puede ver arriba, he incluido audio / mpeg, audio / mpeg3 y audio / x-mpeg-3, pero ninguno de ellos parece marcar la diferencia.
¿Puede alguien sugerir cuál podría ser el problema y también indicar qué tipo de audio es el que se necesita para permitir las cargas de .mp3?
Gracias
Actualización: el código que estoy usando para ejecutar la verificación en el archivo es el siguiente:
// check that file is within the permitted size
if ($_FILES[''file-upload''][''size''][$number] > 0 || $_FILES[''file-upload''][''size''][$number] <= MAX_FILE_SIZE) {
$sizeOK = true;
}
// check that file is of an permitted MIME type
foreach ($permitted as $type) {
if ($type == $_FILES[''file-upload''][''type''][$number]) {
$typeOK = true;
break;
}
}
if ($sizeOK && $typeOK) {
switch($_FILES[''file-upload''][''error''][$number]) {
case 0:
// check if a file of the same name has been uploaded
if (!file_exists(UPLOAD_DIR.$file)) {
// move the file to the upload folder and rename it
$success = move_uploaded_file($_FILES[''file-upload''][''tmp_name''][$number], UPLOAD_DIR.$file);
}
else {
// strip the extension off the upload filename
$filetypes = array(''//.doc$/'', ''//.pdf$/'', ''//.txt$/'', ''//.rtf$/'', ''//.gif$/'', ''//.jpg$/'', ''//.jpeg$/'', ''//.png$/'', ''//.tiff$/'', ''//.mpeg$/'', ''//.mpg$/'', ''//.mp4$/'', ''//.mov$/'', ''//.wmv$/'', ''//.zip$/'', ''//.rar$/'', ''//.mp3$/'');
$name = preg_replace($filetypes, '''', $file);
// get the position of the final period in the filename
$period = strrpos($file, ''.'');
// use substr() to get the filename extension
// it starts one character after the period
$filenameExtension = substr($file, $period+1);
// get the next filename
$newName = getNextFilename(UPLOAD_DIR, $name, $filenameExtension);
$success = move_uploaded_file($_FILES[''file-upload''][''tmp_name''][$number], UPLOAD_DIR.$newName);
}
if ($success) {
$result[] = "$file uploaded successfully";
}
else {
$result[] = "Error uploading $file. Please try again.";
}
break;
case 3:
$result[] = "Error uploading $file. Please try again.";
default:
$result[] = "System error uploading $file. Contact webmaster.";
}
}
elseif ($_FILES[''file-upload''][''error''][$number] == 4) {
$result[] = ''No file selected'';
}
else {
$result[] = "$file cannot be uploaded. Maximum size: $max. Acceptable file types: doc, pdf, txt, rtf, gif, jpg, png, tiff, mpeg, mpg, mp3, mp4, mov, wmv, zip, rar.";
}
Estoy obteniendo el resultado final que me dice que el tamaño del archivo es incorrecto o que la extensión no está permitida.
Actualización 2: he ejecutado un print_r de la matriz _FILES para proporcionar un poco más de información. Los resultados son:
Array ([file-upload] => Array ([name] => Array ([0] => Mozart.mp3 [1] => [2] =>)
[type] => Array
(
[0] => audio/mpg
[1] =>
[2] =>
)
[tmp_name] => Array
(
[0] => /Applications/MAMP/tmp/php/phpgBtlBy
[1] =>
[2] =>
)
[error] => Array
(
[0] => 0
[1] => 4
[2] => 4
)
[size] => Array
(
[0] => 75050
[1] => 0
[2] => 0
)
)
)
Aquí hay un código que le dará algún significado simbólico a sus errores:
class UploadException extends Exception {
public function __construct($code) {
$message = $this->codeToMessage($code);
parent::__construct($message, $code);
}
private function codeToMessage($code) {
switch ($code) {
case UPLOAD_ERR_INI_SIZE:
$message = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
break;
case UPLOAD_ERR_FORM_SIZE:
$message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
break;
case UPLOAD_ERR_PARTIAL:
$message = "The uploaded file was only partially uploaded";
break;
case UPLOAD_ERR_NO_FILE:
$message = "No file was uploaded";
break;
case UPLOAD_ERR_NO_TMP_DIR:
$message = "Missing a temporary folder";
break;
case UPLOAD_ERR_CANT_WRITE:
$message = "Failed to write file to disk";
break;
case UPLOAD_ERR_EXTENSION:
$message = "File upload stopped by extension";
break;
default:
$message = "Unknown upload error";
break;
}
return $message;
}
}
// Use
if ($_FILES[''file''][''error''] === UPLOAD_ERR_OK) {
//uploading successfully done
} else {
throw new UploadException($_FILES[''file''][''error'']);
}
Si obtiene un error de su última declaración, es difícil decir exactamente qué lo desencadenó. Intenta usar algo como lo de arriba. http://www.php.net/manual/en/features.file-upload.errors.php
El límite de 5MB es probablemente tu problema.
Nunca debe suponer que el valor en $ _FILES [''tipo''] realmente coincide con el tipo del archivo. El cliente puede enviar cualquier cadena arbitraria, y PHP no lo verifica en absoluto. Mira aquí .
Tendrá que hacer el trabajo usted mismo para determinar realmente qué tipo de archivo se cargó, a menos que tenga una buena razón para no preocuparse por la seguridad en absoluto (que probablemente no sea así). PHP proporciona el paquete de información de archivos de forma predeterminada, que hace el trabajo pesado por usted. Ver finfo_file () .
MAX_FILE_SIZE es un valor en Bytes
5120000 no es 500 MB. Son 5MB según mis cálculos.
También deberá verificar que no exceda las variables "post_max_size" y "upload_max_size" en su archivo php.ini
En segundo lugar, un mp3 puede ser cualquiera de los siguientes tipos mimet
- audio / mpeg
- audio / x-mpeg
- audio / mp3
- audio / x-mp3
- audio / mpeg3
- audio / x-mpeg3
- audio / mpg
- audio / x-mpg
- audio / x-mpegaudio
Dudo si todavía necesitas esto, pero estoy seguro de que muchos también enfrentarán este mismo problema. Esto es lo que hice y funcionó para mí.
Código de Php:
if(isset($_POST[''submit''])) {
$fileName = $_FILES[''userfile''][''name''];
$tmpName = $_FILES[''userfile''][''tmp_name''];
$fileSize = $_FILES[''userfile''][''size''];
$fileType = $_FILES[''userfile''][''type''];
if ($fileType != ''audio/mpeg'' && $fileType != ''audio/mpeg3'' && $fileType != ''audio/mp3'' && $fileType != ''audio/x-mpeg'' && $fileType != ''audio/x-mp3'' && $fileType != ''audio/x-mpeg3'' && $fileType != ''audio/x-mpg'' && $fileType != ''audio/x-mpegaudio'' && $fileType != ''audio/x-mpeg-3'') {
echo(''<script>alert("Error! You file is not an mp3 file. Thank You.")</script>'');
} else if ($fileSize > ''10485760'') {
echo(''<script>alert("File should not be more than 10mb")</script>'');
} else if ($rep == ''Say something about your post...'') {
$rep == '''';
} else {
// get the file extension first
$ext = substr(strrchr($fileName, "."), 1);
// make the random file name
$randName = md5(rand() * time());
// and now we have the unique file name for the upload file
$filePath = $uploadDir . $randName . ''.'' . $ext;
$result = move_uploaded_file($tmpName, $filePath);
if (!$result) {
echo "Error uploading file";
exit;
}
if(!get_magic_quotes_gpc()) {
$fileName = addslashes($fileName);
$filePath = addslashes($filePath);
}
$sql = "INSERT INTO media SET
path = ''$filePath'',
size = ''$fileSize'',
ftype = ''$fileType'',
fname = ''$fileName''";
if (mysql_query($sql)) {
echo('''');
} else {
echo(''<p style="color: #ff0000;">Error adding audio: '' . mysql_error() . ''</p><br />'');
}
y su código html será;
<form action="<?php $_SERVER[''PHP_SELF''] ?>" method="post" enctype="multipart/form-data"">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="file" class="file_input" name="userfile" />
<input type="submit" value="" name="submit" id="submitStatus" class="submit" />
</form>