В настоящее время я получаю предупреждающие сообщения PHP, говорящие («ожидается, что параметр 1 будет ресурсом»), когда пытаюсь запустить fseek, feof и fread. Я считаю, что это потому, что он не может найти файл в каждом случае.
Позвольте мне дать вам небольшую предысторию. Я создаю капчу wav, а затем транслирую файл. Он работает во всех современных браузерах (кроме IE, но я использую Flash), но работает медленно в iOS.
Я считаю, что проблема связана с переменной $fm, но любая помощь будет оценена по достоинству.
public function outputAudioFile()
{
set_error_handler(array(&$this, 'errorHandler'));
require_once 'wavfile.php';
try {
$audio = $this->getAudibleCode();
} catch (Exception $ex) {
if (($fp = @fopen(dirname(__FILE__) . '/si.error_log', 'a+')) !== false) {
fwrite($fp, date('Y-m-d H:i:s') . ': secureaudio audio error "' . $ex->getMessage() . '"' . "\n");
fclose($fp);
}
$audio = $this->audioError();
}
if ($this->canSendHeaders() || $this->send_headers == false)
{
if ($this->send_headers)
{
//download range
$file_size = strlen($audio);
$start_point = 0;
$end_point = $file_size - 1;
if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE']))
{
//download range
$http_range = explode('-', substr($_SERVER['HTTP_RANGE'], strlen('bytes=')));
$start_point = $http_range[0];
if($http_range[1] > 0)
$end_point = $http_range[1];
//headers
header('HTTP/1.1 206 Partial Content');
header('Status: 206 Partial Content');
header('Content-Length: '.($end_point - $start_point + 1));
}
//full download
else
{
//headers
header('HTTP/1.1 200 OK');
header("Status: 200 OK");
header('Content-Length: '.$file_size);
}
//headers
$uniq = md5(uniqid(microtime()));
header('Content-Type: audio/x-wav');
header('Accept-Ranges: bytes');
header("Content-Range: bytes $start_point-$end_point/$file_size");
header("Content-Disposition: attachment; filename=\"secureaudio-{$uniq}.wav\"");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", time() + 3600*(0+date("I")))." GMT");
header("Expires: ".gmdate("D, d M Y H:i:s", time() + 7200*(0+date("I")))." GMT");
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
header("Content-Transfer-Encoding: binary\n");
header('Connection: close');
$fm = fopen($audio, 'r');
fseek($fm,$start_point);
while(!feof($fm)&&$start_point<$end_point&&(connection_status()==0))
{
print fread($fm,min(1024*16,$end_point-$start_point));
$start_point+=1024*16;
}
}
//output it
echo $audio;
}
else
{
echo '<hr /><strong>'
.'Failed to generate audio file, content has already been '
.'output.<br />This is most likely due to misconfiguration or '
.'a PHP error was sent to the browser.</strong>';
}
restore_error_handler();
if (!$this->no_exit) exit;
}
@
изfopen
. Также попробуйтеfile_get_contents()
с его параметрами seek и length для простоты. Однако нет обходного пути для отсутствующих файлов или неправильных имен файлов. - person mario   schedule 10.10.2012