首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是.docx、.pptx等的正确MIME类型?

什么是.docx、.pptx等的正确MIME类型?
EN

Stack Overflow用户
提问于 2010-11-18 16:25:44
回答 10查看 755.7K关注 0票数 1.2K

对于较旧的*.doc文档,这就足够了:

代码语言:javascript
运行
复制
header("Content-Type: application/msword");

我应该为新的.docx文档使用哪种MIME类型?另外,对于pptx和xlsx文档?

EN

Stack Overflow用户

发布于 2018-12-07 09:01:48

这篇文章将探索在各种编程语言中获取MIME类型的各种方法,并将它们的缺点用一行描述作为标题。因此,相应地使用它们,并使用对您有效的方法。

例如。当用户可以提供.xls、.xlsx或.xlsm中的任何一个,而您不想编写代码测试扩展并为它们提供MIME类型时,下面的代码特别有用。让系统来完成这项工作。

Python 3

使用python-magic

代码语言:javascript
运行
复制
>>> pip install python-magic
>>> import magic
>>> magic.from_file("Employee.pdf", mime=True)
'application/pdf'

使用内置的mimeypes模块-将文件名映射到MimeTypes模块

代码语言:javascript
运行
复制
>>> import mimetypes
>>> mimetypes.init()
>>> mimetypes.knownfiles
['/etc/mime.types', '/etc/httpd/mime.types', ... ]
>>> mimetypes.suffix_map['.tgz']
'.tar.gz'
>>> mimetypes.encodings_map['.gz']
'gzip'
>>> mimetypes.types_map['.tgz']
'application/x-tar-gz'

JAVA 7

来源:Baeldung's blog on File MIME Types in Java

依赖于操作系统

代码语言:javascript
运行
复制
@Test
public void get_JAVA7_mimetype() {
    Path path = new File("Employee.xlsx").toPath();
    String mimeType = Files.probeContentType(path);

    assertEquals(mimeType, "application/vnd.ms-excel");
}

它将使用FileTypeDetector实现来探测MIME类型,并调用每个实现的probeContentType来解析该类型。因此,如果文件对于实现是已知的,则返回内容类型。但是,如果没有发生这种情况,则会调用系统默认的文件类型检测器。

使用输入流的前几个字符进行解析

代码语言:javascript
运行
复制
@Test
public void getMIMEType_from_Extension(){
    File file = new File("Employee.xlsx");
    String mimeType = URLConnection.guessContentTypeFromName(file.getName());

    assertEquals(mimeType, "application/vnd.ms-excel");
}

使用内置的MIME类型表

代码语言:javascript
运行
复制
@Test
public void getMIMEType_UsingGetFileNameMap(){
    File file = new File("Employee.xlsx");
    FileNameMap fileNameMap = URLConnection.getFileNameMap();
    String mimeType = fileNameMap.getContentTypeFor(file.getName());

    assertEquals(mimeType, "image/png");
}

它返回所有URLConnection实例使用的MIME类型矩阵,然后使用该矩阵解析输入文件类型。然而,当涉及到URLConnection时,这种MIME类型矩阵非常有限。

默认情况下,该类使用JRE_HOME/lib中的content-types.properties文件。但是,我们可以通过使用content.types.user.table属性指定一个特定于用户的表来扩展它:

代码语言:javascript
运行
复制
System.setProperty("content.types.user.table","<path-to-file>");

JavaScript

消息来源:FileReader API & Medium's article on using Magic Numbers in JavaScript to get Mime Types

解释使用FileReader接口获取的魔数

当使用javaScript根据文件流获取MimeType时,最终结果如下所示。打开embedded jsFiddle以查看和理解此方法。

Bonus:大多数MIME类型都可以访问它,也可以在getMimetype函数中添加自定义Mime类型。此外,它还完全支持MS Office文件的Mime类型。

在此示例中,计算文件的mime类型的步骤如下:

  1. 用户选择一个文件。
  2. 使用切片获取文件的前4个字节,创建一个新的FileReader实例
  3. 使用FileReader读取您切出的4个字节作为数组,数组缓冲区只是一种表示二进制缓冲区的通用方法,我们需要创建一个TypedArray,在这种情况下,Uint8Array.
  4. With是我们手中的TypedArray,我们可以检索每个字节并将其转换为十六进制(通过使用toString(16)).
  5. We,现在有一种方法可以通过读取前四个字节从文件中获取幻数。最后一步是将其映射为真正的mime类型。

支持浏览器(总体支持95%以上,在所有现代浏览器中接近100% )

代码语言:javascript
运行
复制
const uploads = []

const fileSelector = document.getElementById('file-selector')
fileSelector.addEventListener('change', (event) => {
  console.time('FileOpen')
  const file = event.target.files[0]

  const filereader = new FileReader()

  filereader.onloadend = function(evt) {
    if (evt.target.readyState === FileReader.DONE) {
      const uint = new Uint8Array(evt.target.result)
      let bytes = []
      uint.forEach((byte) => {
        bytes.push(byte.toString(16))
      })
      const hex = bytes.join('').toUpperCase()

      uploads.push({
        filename: file.name,
        filetype: file.type ? file.type : 'Unknown/Extension missing',
        binaryFileType: getMimetype(hex),
        hex: hex
      })
      render()
    }

    console.timeEnd('FileOpen')
  }


  const blob = file.slice(0, 4);
  filereader.readAsArrayBuffer(blob);
})

const render = () => {
  const container = document.getElementById('files')

  const uploadedFiles = uploads.map((file) => {
    return `<div class=result><hr />
                    <span class=filename>Filename: <strong>${file.filename}</strong></span><br>
                    <span class=fileObject>File Object (Mime Type):<strong> ${file.filetype}</strong></span><br>
                    <span class=binaryObject>Binary (Mime Type):<strong> ${file.binaryFileType}</strong></span><br>
                    <span class=HexCode>Hex Code (Magic Number):<strong> <em>${file.hex}</strong></span></em>
                    </div>`
  })

  container.innerHTML = uploadedFiles.join('')
}

const getMimetype = (signature) => {
  switch (signature) {
    case '89504E47':
      return 'image/png'
    case '47494638':
      return 'image/gif'
    case '25504446':
      return 'application/pdf'
    case 'FFD8FFDB':
    case 'FFD8FFE0':
    case 'FFD8FFE1':
      return 'image/jpeg'
    case '504B0304':
      return 'application/zip'
    case '504B34':
      return 'application/vnd.ms-excel.sheet.macroEnabled.12'
    default:
      return 'Unknown filetype'
  }
}
代码语言:javascript
运行
复制
.result {
  font-family: Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", Georgia, serif;
  line-height: 20px;
  font-size: 14px;
  margin: 10px 0;
}

.filename {
  color: #333;
  font-size: 16px;
}

.fileObject {
  color: #a53;
}

.binaryObject {
  color: #63f;
}

.HexCode {
  color: #262;
}

em {
  padding: 2px 4px;
  background-color: #efefef;
  font-style: normal;
}

input[type=file] {
  background-color: #4CAF50;
  border: none;
  color: white;
  padding: 8px 16px;
  text-decoration: none;
  margin: 4px 2px;
  cursor: pointer;
}
代码语言:javascript
运行
复制
<body>

  <input type="file" id="file-selector">

  <div id="files"></div>

票数 7
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4212861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档