【问题标题】:Forcing an anchor href to treat octet-stream as images?强制锚href将八位字节流视为图像?
【发布时间】:2013-08-07 22:41:13
【问题描述】:

我有一些图像被错误地存储在 S3 上,MIME 类型为application/octet-stream。当我把这张图片放在一个带有锚点的网站上时,即<a href="imgurl",图片会自动下载,而不是在浏览器中查看。

是否有办法解决此问题并强制浏览器将链接视为图像?

【问题讨论】:

  • 你能修复文件的存储方式吗?如果没有,我建议代理请求。
  • @Brad,是的,最终我认为纠正文件存储是解决这个问题的方法,但我想知道暂时是否有解决方法。

标签: html image mime-types


【解决方案1】:

我不知道为什么 MightyPork 删除了他的答案,但基本的想法是在 PHP 中创建一个代理,它将为您提供具有正确 MIME 类型的文件。

<?php

function error403() {
  header('HTTP/1.0 403 Forbidden');
  die('You are not allowed to access this file.');     
}

function serveFile($file, $mimeType) {
  header('Content-Type: ', $mimeType);
  header('Content-Length: ', filesize($file));

  readfile($file);
}

function determineMimeType($file) {
  $mimeMap = array(
    'png' => 'image/png',
    'jpg' => 'image/jpeg',
    'jpeg' => 'image/jpeg',
    'gif' => 'image/gif'
  );
  $fileExt = strtolower(pathinfo($path, PATHINFO_EXTENSION));
  if (isset($mimeMap[$fileExt])) {
    return $mimeMap[$fileExt];
  }
  return false;
}

// entry point
$whitelist = array('test1.png', 'test2.png');
$filePath = isset($_GET['file']) ? $_GET['file'] : error403();

if (!in_array($filePath, $whitelist)) {
  error403();
}

$mime = determineMimeType($filePath);
if ($mime === false) {
  // error handling, logging, etc.
}
serveFile($filePath, $mime);

【讨论】:

  • 这是个好建议。我使用的是 Grails 而不是 PHP,但我认为我可能能够像上面的代码一样工作。
  • @JamesMcMahon 这应该是可行的。但是有两个重要的安全方面:创建(文件和/或目录的)白名单并注意文件路径中可能存在的..
  • 我将假设这意味着没有纯粹的客户端解决方法并将其标记为答案。谢谢!
  • @JamesMcMahon 您也可以通过 JavaScript/AJAX 获取数据,但是您必须在提供文件时发送特殊标头(=再次创建代理)。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多