Я ничего не знаю о внутренних интерпретаторах Python-интерпретатора (и я тоже не являюсь экспертом в компиляторах и интерпретаторах), поэтому не обвиняйте меня, если я предлагаю что-либо недоступное или невозможное.
При условии, что python объекты меняются. Я думаю, что это следует учитывать при разработке аргументов аргументов по умолчанию. Когда вы создаете экземпляр списка:
a = []
вы ожидаете получить новый список, на который ссылается a .
Почему a = [] в
def x(a=[]):
создать новый список по определению функции, а не по вызову? Это точно так же, как вы спрашиваете: «Если пользователь не предоставляет аргумент, тогда создает экземпляр нового списка и использует его, как если бы он был создан вызывающим». Я думаю, что это неоднозначно:
def x(a=datetime.datetime.now()):
пользователь, вы хотите a по умолчанию использовать дату и время, соответствующее тому, когда вы определяете или выполняете x ? В этом случае, как и в предыдущем, я буду придерживаться такого же поведения, как если бы аргумент по умолчанию «назначение» был первой инструкцией функции (datetime.now (), вызванной вызовом функции). С другой стороны, если пользователь хотел отобразить время отображения, он мог бы написать:
b = datetime.datetime.now()
def x(a=b):
Я знаю, я знаю: это закрытие. В качестве альтернативы Python может предоставить ключевое слово для привязки определения времени:
def x(static a=b):
Ответы от liberpeace, Kiyarash и Sam Vloeberghs:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
Я также проверил бы имя файла. Вот как вы можете проверить, является ли файл RAR или ZIP-файлом. Я тестировал его, создавая приложение быстрой командной строки.
<?php
if (isRarOrZip($argv[1])) {
echo 'It is probably a RAR or ZIP file.';
} else {
echo 'It is probably not a RAR or ZIP file.';
}
function isRarOrZip($file) {
// get the first 7 bytes
$bytes = file_get_contents($file, FALSE, NULL, 0, 7);
$ext = strtolower(substr($file, - 4));
// RAR magic number: Rar!\x1A\x07\x00
// http://en.wikipedia.org/wiki/RAR
if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
return TRUE;
}
// ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive),
// or PK\007\008 (spanned archive) are common.
// http://en.wikipedia.org/wiki/ZIP_(file_format)
if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
return TRUE;
}
return FALSE;
}
Обратите внимание, что он все еще не будет на 100% уверенным, но, вероятно, он достаточно хорош.
$ rar.exe l somefile.zip
somefile.zip is not RAR archive
Но даже WinRAR обнаруживает файлы без RAR как архивы SFX:
$ rar.exe l somefile.srr
SFX Volume somefile.srr
Вы не должны доверять $_FILES['upfile']['mime']
, проверьте тип MIME самостоятельно. Для этой цели вы можете использовать расширение fileinfo
, включенное по умолчанию с PHP 5.3.0.
$fileInfo = new finfo(FILEINFO_MIME_TYPE);
$fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
$validMimes = array(
'zip' => 'application/zip',
'rar' => 'application/x-rar',
);
$fileExt = array_search($fileMime, $validMimes, true);
if($fileExt != 'zip' && $fileExt != 'rar')
throw new RuntimeException('Invalid file format.');
ПРИМЕЧАНИЕ. Не забудьте включить расширение в ваш php.ini
и перезагрузите сервер:
extension=php_fileinfo.dll
Поскольку расширение может содержать более или менее трех символов, следующее будет проверяться на расширение независимо от его длины.
Попробуйте следующее:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
, чтобы проверить все символы после последнего «.»
Официальный список типов mime можно найти по адресу Владелец присвоенных номеров (IANA) . В соответствии с их заголовком Content-Type
для zip
является application/zip
.
Тип носителя для файлов rar
официально не зарегистрирован в IANA, но неофициальное широко используемое значение типа mime - application/x-rar-compressed
.
application/octet-stream
означает столько же: «Я отправляю вам поток файлов, а содержимое этого потока не указано» (так что это правда, что это может быть файл zip
или rar
). Предполагается, что сервер обнаруживает, что такое фактическое содержимое потока.
Примечание. Для загрузки небезопасно полагаться на тип mime, установленный в заголовке Content-Type
. Заголовок настроен на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать функции php file info для обнаружения файла mime-типа на сервере.
Если вы хотите загрузить файл zip
, и ничего больше, вы должны установить только одно значение заголовка Accept
. Любые дополнительные значения будут использоваться в качестве резерва в случае, если сервер не сможет удовлетворить ваш запрос в запрошенном типе application/octet-stream
заголовка.
В соответствии со спецификациями WC3 :
application/zip, application/octet-stream
будет интерпретироваться как: «Я предпочитаю микс-тип application/zip
, но если вы не можете доставить это, application/octet-stream
(поток файлов) также прекрасен».
Итак, только один:
application/zip
Гарантирует вам файл zip
(или ответ 406 - Not Acceptable
в случае, если сервер не может удовлетворить ваш запрос) .
application/x-zip-compressed
– Kiyarash 6 October 2014 в 20:21zip
илиrar
. Согласно спецификациям WC3 это будет понято как: "Я предпочитаю тип содержимогоapplication/zip
|application/x-rar-compressed
, но если вы не можете доставить этоapplication/octet-stream
(поток файлов) также отлично ". i> – Wilt 9 April 2015 в 13:14