Сервер создает файл на лету для сохранения клиентом - PullRequest
1 голос
/ 17 февраля 2011

ПРИМЕР

1) Пользователь входит в плейлист в <textarea>

  • C: /music/foo.mp3
  • C: /music/bar.mp3
  • C: /music/hello.mp3

2) Они нажимают кнопку save . Я отправляю плейлист пользователя на сервер с AJAX.

3) Сервер форматирует текст с помощью PHP следующим образом:

<playlist>
 <item>C:/music/foo.mp3</item>
 <item>C:/music/bar.mp3</item>
 <item>C:/music/hello.mp3</item>
</playlist>

4) Появляется диалоговое окно сохранения файла, в котором пользователю предлагается сохранить этот форматированный текст как playlist.m3u на своем жестком диске.


ВОПРОСЫ

A) Можно ли не записать файл на жесткий диск на сервере при создании этого файла m3u? Я не хочу, чтобы миллионы файлов забивали мой сервер. Я полагаю, что PHP может выводить форматированный текст и устанавливать заголовки для маскировки в виде файла.

B) Как получить всплывающее диалоговое окно сохранения файла для этого на лету файла? Если бы это был настоящий файл, я бы просто ответил PHP с указанием местоположения файла. Тогда я бы попросил JS вставить новый iFrame с этим местоположением. Но я не хочу писать файл на сервере, поэтому я не могу этого сделать.

new Ajax.Request(
 'generateM3u.php',
 onSuccess: function(transport) {
  $$('body').first().appendChild(
   new Element(
    'iframe', {
     src: transport.responseText
    }
   )
  );
 }
);

Ответы [ 3 ]

2 голосов
/ 17 февраля 2011

Вы должны взглянуть на http://php.net/manual/en/function.header.php из руководства по PHP. Внизу страницы есть много сообщений о том, как заставить браузер показывать приглашение на загрузку, а не печатать на экран.

Вот один из этой страницы ( По phpnet в holodyn dot com 31-Jan-2011 09: 01 ), который я немного отредактировал. Я думаю, что он отвечает на оба вопроса A и B. Просто отправьте содержимое текстового поля в файл PHP через iframe, разрешите ему соответствующим образом отформатировать текст и отправьте его обратно в браузер со следующими заголовками.

$contents = '<playlist>etc....</playlist>';

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false); // required for certain browsers
header("Content-Type: audio/x-mpegurl");
header("Content-Disposition: attachment; filename=\"playlist.m3u\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($contents));
ob_clean();
flush();
echo $contents;

Редактировать: Если то, что вы хотите, - это полностью решение Javascript, то я лично не знаю, и после небольшого поиска в Google, похоже, что другие тоже не знают. Большинство, похоже, решают эту проблему с помощью невидимого iframe, который направляет файл на стороне сервера.

Редактировать 2: Я изменил тип содержимого, чтобы он соответствовал типу файла m3u.

2 голосов
/ 17 февраля 2011

Как насчет создания формы в родительском DOM и отправки ее в созданное вами IFRAME / всплывающее окно?

URL-адрес действия POST будет вашим generateMu3.php

Чтобы ответить на ваши вопросы,

A & B) Полагаю, что так ... пока generateM3u.php устанавливает правильный MIMEType для файла .m3u ...

Я не знаком с синтаксисом в PHP, но в Java и .NET вы можете установить MIMEType ответа в заголовке, скажем, на документ Word, и браузер будет читать заголовок, и если файл с возможностью сохранения, предложит клиенту сохранить страницу в виде файла.

0 голосов
/ 17 февраля 2011

Если я правильно прочитал, есть машина, создающая файлы .m3u.В этом случае, возможно, просто запишите файлы во временный каталог, /tmp на компьютерах с Unix и C:\Windows\Temp на компьютерах с Windows.Эти файлы очищаются при загрузке, что должно позволить вам обрабатывать B) без всех A) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...