- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道(从这个问题的答案:.rar, .zip files MIME Type)大多数人将 PHP 中的 zip 文件检查为 application/zip
或 application/octet-stream
,但我对此有几个问题:
application/octet-stream
是否安全(假定 application/octet-stream
可用于描述更多的文件类型,而不仅仅是 zip! ).我知道我也可以通过其他方式检查文件,但我认为我应该尽量让一切都尽可能简单application/x-external-editor
,但是 PHP 在处理它时遇到问题(尽管我得到的唯一错误是 Warning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object
) - 这在任何地方都有记录吗?是否有 PHP 可以处理的实际 x-
mimetypes 列表?编辑
回答以下问题:
$_FILES['fileatt']['type']
检查 mime 类型,但使用 mime_content_type()
得到相同的结果。不同的 zip 文件似乎是以下任何一种:'application/zip'
, 'application/x-compressed'
, 'application/x-zip-压缩'
,'application/x-compressed'
,'multipart/x-zip'
。我不明白为什么在检测到 MIME 类型为 application/x-external-editor
时出现错误。我还发现了另一件我不太明白的事情:当我将以下代码与 PHP 读取为 application/x-external-editor
的文件一起使用时:
if($zip->open($_FILES[fileatt]['tmp_name'])===TRUE)
{
echo "success";
} else {
echo "error";
}
打印“错误”,但检查文件类型为
$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res)
{
echo "success";
} else {
echo "error";
}
打印“成功”;在此代码中,我假设 bool 值有效地使用了 ==
,而不是 ===
,但为什么这会有所不同?
错误:
$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res===TRUE)
{
echo "success";
} else {
echo $res;
}
打印 19
- 19 指的是哪个错误 ( http://uk3.php.net/manual/en/ziparchive.open.php )?!
最佳答案
永远不要相信 mime 类型,这很容易被客户端欺骗。如果他们愿意,他们可以提交一个 exe 并给它一个 text/plain
的 mime 类型。
所有 zip 文件都以标准本地文件头签名 (0x04034b50) 开头,因此您可以检查文件的前 4 个字节是否与 zip 签名字节匹配。查看PKZIP Appnote了解更多详情。
如果您有 zip extension启用后,您可以更进一步尝试打开并阅读 zip 文件以确保它是一个完全有效的 zip 文件。
像这样的东西效果很好:
$zip = zip_open('/path/to/file.zip');
if (is_int($zip)) {
echo "Error $zip encountered reading the file, is it a valid zip?";
} else {
echo "Thanks for uploading a valid zip file!";
}
zip_open
如果成功打开则返回一个资源,否则返回一个表示读取文件时发生的错误的整数。
编辑:详细说明您的一些问题:
关于application/octet-stream
:这个就是你说的,一个很通用的类型。这仅表示包含 8 位数据的任何文件,基本上是所有内容。 application/zip
是事实上的标准 mime 类型,但有些客户端会使用您发现的其他值。还考虑到客户端可以轻松欺骗任何文件类型以使用 application/zip
我不会依赖 $_FILES['fileatt']['type']
因为它可以是任何东西。
AFIK,mime_content_type()
只是查看文件扩展名并将其映射到 mime.types 中的 mime 类型文件在系统上或内置到 PHP 中。如果有人将 .zip
扩展名放在 exe
文件上,它仍会注册为 application/zip
。我相信某些扩展程序可能会检查文件头。
Zip::open()
返回 TRUE
如果文件打开成功,或者一个整数错误代码。因此,==
会给你一个错误的误报,因为任何非零整数都将使用 ==
评估为真,因为它会将非零整数转换为真
。如果您要检查 Zip::open
的返回,您应该始终使用 $res === true
以检查是否成功。您可以找到错误代码的含义 here在页面底部的评论中。
底线:既然你说你已经解压了 zip,那么根据 mime 类型进行验证可能不那么麻烦,而是尝试打开文件并根据返回结果进行验证会更容易open
的值。如果它返回 true,您可以认为该文件是一个有效的 zip(文件后面当然可能有错误,但他们至少上传了类似 zip 文件的东西)。
希望对您有所帮助。
关于PHP 允许的 zip mimetypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10558251/
我正在使用 MediaRecorder API 在页面上录制一些媒体。在我的 MediaRecorder 初始化中,我没有指定内容类型,因为我不需要任何特别的内容。浏览器可以选择它想要的内容。 var
我有一个可以返回 text/html 或 application/pdf 内容的 servlet。显然,看起来 Internet Explorer (IE7) 没有正确处理应用程序/pdf。 例如。
我正在使用 C# 库 DotNetZip(Ionic.Zip 和 Ionic.Zlib)从目录生成电子书。目录如下所示: BookName | |___content/ | images/
我有一个带有二进制字段的文件模型 class File(models.Model): id = models.AutoField(primary_key=True) file = mo
覆盖模型保存方法时,有没有办法获取上传文件的内容类型?我试过这个: def save(self): print(self.file.content_type) super(Media,
我正在从 azure 读取文件。 mimetype 是 video/mp4 ,位于 response.headers["content-type"] 中。我找不到如何向文件添加 mimetypes,因
我想知道如果我运行这段代码会发生什么: MimeType Tester 我的内容将被解析为 XML 或 HTML?两个都?其他? 我还有一个 JS
我怎样才能从应用程序中获取 mimeType。 我正在开发一个基于 mimeType 过滤某些已安装应用程序的应用程序。 有人可以帮我解决这个问题吗? 非常感谢 最佳答案 mime 类型与 Activ
我需要获取项目对象的 MimeType: 我有什么:- 来自 EWS 的项目对象 (microsoft.exchange.webservices.data.Item) 我想要什么:- 该项目的 mim
我下载了一些文件,比如word、ppt、excel。但我不知道他们的 MIMETYPE 和后缀。有什么方法可以获取这些文件的 MIMETYPE? 最佳答案 如果您不知道后缀,则必须查看文件内容。通常,
如何使用 mimetypes 包中的 add_type() 函数添加新的 mimetype?我需要对 python 文件系统做些什么吗?如果我尝试类似这样的操作:add_type('text/new'
有人知道一种从字节数组中获取 mime 类型的方法吗?注意,我想在没有外部库的情况下做到这一点,只有 native java。 最佳答案 有一种方法可以使用 Java 7 来做到这一点,但它有点笨拙(
这只是一个用户上传一个文件。 最佳答案 UploadedFile.content_type 将返回上传时随文件一起发送的内容类型 header 。 如果您还需要在保存后检查文件,您可以使用 pytho
我正在尝试使用 Intent 打开一个 File,但 Android 没有打开适合该文件类型的应用程序。 使用以下代码,每个文件 - pdf、图像,所有内容 - 都使用音乐应用程序打开: Intent
从文件中使用 finfo 获取 mimetype $finfo = new finfo(FILEINFO_MIME); $type = $finfo->file($file); 从字符串中使用 fin
MIME::Types.type_for(filename) 我需要安装什么 gem,使用它需要什么文件? 最佳答案 gem install mime-types 和require 'mime/typ
我有两个节点应用程序在两个不同的端口上运行。 为了让 nginx 适本地路由请求,我有两个位置 block , # /etc/nginx/sites-available/my_site.com ser
如何在 xcode 中将 mimetype 转换为文件扩展名 例如我有这个代码 File Extension MIME Type aifc audio/x-aif
我正在考虑使用浏览器的 navigator.mimeTypes 数组作为第三级用户/浏览器标识符。例如,当我在 Chrome 上运行时... console.log(navigator.mimeTyp
我正在通过 MimeType 扫描目录。到目前为止,我的代码计算了目录中现有 MimiType 的总数: File dir = new File(dirPath); File[] files = di
我是一名优秀的程序员,十分优秀!