【问题标题】:Download MP3 via file_get_contents when URL contains long dash (–)当 URL 包含长破折号 (–) 时,通过 file_get_contents 下载 MP3
【发布时间】:2018-07-25 17:19:46
【问题描述】:

我正在尝试将一组 MP3 文件下载到 ZIP 文件夹。所有 MP3 都托管在 S3 上。我的程序运行良好,除非 URL 包含这样的长破折号:https://s3.amazonaws.com/publicverses/2Corinthians11verse24–33_user400_56.mp3

注意2433 之间的长破折号。此文件和其他类似文件显示在 ZIP 中为空(即 0kb)。我该如何解决这个问题?

foreach ($files as $file) {
      $download_file = file_get_contents($file);
      $zip->addFromString(basename($file), $download_file);
  }

【问题讨论】:

  • urlencode 可能吗?
  • 是一个非 ASCII 字符,这可能会导致问题。试试urlencode()
  • 我应该把 urlencode() 函数放在哪里?
  • @jumpingmaniac file_get_contents(urlencode($file))。我不太确定,但试试这个。
  • 我就是这么想的。我试过了,但现在我所有的文件都是 0kb。

标签: php


【解决方案1】:

你需要urlencode() 文件名,或者路径的任何部分,如果它包含像这个unicode emdash这样的任何高位字符。为了记录,网络浏览器在后台执行此操作是为了方便用户。

在构造 URL 之前 这样做是最简单的,但是如果你遇到了这个问题的预制 URL,那么你需要将它分开并只处理您需要更改的部分。例如:

// from: http://php.net/manual/en/function.parse-url.php#106731
function unparse_url($parsed_url) {
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return "$scheme$user$pass$host$port$path$query$fragment";
}

// this function assumes that *nothing* is encoded, otherwise it will
// double-encode the data and likely break it.
function url_encode_parts($url) {
    $parts = parse_url($url);
    // eg: UTF hostnames are encoded differently
    $parts['host'] = idn_to_ascii($parts['host']);
    $parts['path'] = implode('/', array_map('urlencode', explode('/', $parts['path'])));
    return unparse_url($parts);
}

$url = 'https://s3.amazonaws.com/publicverses/2Corinthians11verse24–33_user400_56.mp3';

var_dump(url_encode_parts($url));

// output:
// string(85) "https://s3.amazonaws.com/publicverses/2Corinthians11verse24%E2%80%9333_user400_56.mp3"

参考:

【讨论】:

    【解决方案2】:

    感谢大家的建议。在这种情况下,我发现最简单的解决方案是更新我的程序,以便在我的 URL 结构中将所有长破折号 () 转换为常规破折号 (-)。换句话说,我决定完全避免使用特殊字符,而不是处理编码问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2013-04-14
      相关资源
      最近更新 更多