Как я могу принять zip-файлы, используя Среднее приложение? [Дубликат]

Я ничего не знаю о внутренних интерпретаторах 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):
112
задан mrdaliri 8 August 2011 в 04:45
поделиться

4 ответа

Ответы от 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
192
ответ дан Sébastien Garcia-Roméo 21 August 2018 в 00:02
поделиться
  • 1
    multipart / x-zip - допустимый тип mimetype для .zip (PKZIP-архив) – Sam Vloeberghs 4 March 2013 в 15:52
  • 2
    на самом деле есть другой MIME TYPE для zip, и это: application/x-zip-compressed – Kiyarash 6 October 2014 в 20:21
  • 3
    Это не гарантирует вам файл zip или rar. Согласно спецификациям WC3 это будет понято как: "Я предпочитаю тип содержимого application/zip | application/x-rar-compressed, но если вы не можете доставить это application/octet-stream (поток файлов) также отлично ". – Wilt 9 April 2015 в 13:14
  • 4
    Вот полезный список типов mime с .zip среди других: sitepoint.com/web-foundations/mime-types-complete-list – sstauross 12 November 2015 в 11:00

Вы не должны доверять $_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
4
ответ дан fibriZo raZiel 21 August 2018 в 00:02
поделиться

Поскольку расширение может содержать более или менее трех символов, следующее будет проверяться на расширение независимо от его длины.

Попробуйте следующее:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

, чтобы проверить все символы после последнего «.»

-1
ответ дан theking2 21 August 2018 в 00:02
поделиться

Для загрузки:

Официальный список типов 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 в случае, если сервер не может удовлетворить ваш запрос) .

21
ответ дан Wilt 21 August 2018 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: