Переименование файлов при загрузке

Я хочу переименовать файл, когда пользователь загрузит его.

Прямо сейчас я отправляю заголовки контента и контента, а затем отправляю файл пользователю с помощью функции PHP fpassthru.

Но есть 3 проблемы с этим методом:

  1. Если я отправляю большие (выше 3-4Gb) файлы таким образом, тогда мой PHP-скрипт запускает слишком много времени и может быть убит таймаутом.
  2. Если пользователь отменяет загрузку, PHP-скрипт продолжает читать и отправлять файл
  3. Если пользователь приостанавливает загрузку, он не может возобновить его позже.

Есть ли лучший способ переименования файлов при загрузке?

Related of "Переименование файлов при загрузке"

Поскольку вопрос был задан, некоторое время прошло, и html5 дал нам другой подход к этому:

 <a href="someWeiredFileName.rar" download="coolFilename.rar">Download</a> 

Загрузка attribute ( подробнее ) определяет filename по умолчанию для хранения файла на компьютере клиента (он все равно сможет его изменить!).

Примечание. Это ничего не повлияет на ваш сервер.

 <?php header('Content-type: application/pdf'); // It will be called downloaded.pdf header('Content-Disposition: attachment; filename="downloaded.pdf"'); // The PDF source is in original.pdf readfile('original.pdf'); ?> 
  1. Файл будет предлагаться для загрузки как «загруженный.pdf», а его первоначальное имя – «original.pdf».

Псевдокод

 while(1) { Echo "..."; //<-- send this to the client if (connection_status()!=0){ die; } } 
  1. Вы можете остановить скрипт PHP, если пользователь отменяет браузер, используя connection_status()

  2. HTTP не может повторно подключить закрытое соединение. FTP может!

Для третьего пункта вы можете попробовать использовать заголовки HTTP Range .
Если у пользователя есть клиент загрузки, способный к возобновлению, он должен отправить эти заголовки в ваш скрипт, который вы могли бы использовать, чтобы точно определить, какие части файла отправить.