У меня есть несколько лицензированных шрифтов, которые я встроил в свой Приложение Rails с использованием тега CSS @ font-face
. Эти шрифты расположены по пути "../ Public / Fonts /"
в моем приложении Rails 3 и отлично отображаются на любом локальном компьютере, на котором я загружаю репозиторий и запускаю его.
Однако, когда я подтолкнуть мое приложение к Heroku, похоже, не удается найти шрифты. Вы можете сказать, что он ищет в каталоге шрифтов, но никогда не может получить к ним доступ. Кажется, не имеет значения, где я размещаю шрифты или как набираю путь к шрифту в объявлении @ font-face.
Мои шрифты находятся в # {RAILS.root} / public / fonts / ChunkFive
Вот мое объявление @ font-face:
@font-face {
font-family: "ChunkFive";
src: url("../fonts/ChunkFive/ChunkFive-webfont.eot");
src: local("?"),
url("../fonts/ChunkFive/ChunkFive-webfont.woff") format("woff"),
url("../fonts/ChunkFive/ChunkFive-webfont.ttf") format("truetype"),
url("../fonts/ChunkFive/ChunkFive-webfont.svg") format("svg");
}
Вот сообщение 404 ресурс не найден, которое я получаю для каждого шрифта:
Request URL:http://thedanbarrett.heroku.com/fonts/ChunkFive/ChunkFive-webfont.woff
Request Method:GET
Status Code:404 Not Found
Request Headers
Referer:http://thedanbarrett.heroku.com/home
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10
(KHTML,like Gecko) Chrome/8.0.552.224 Safari/534.10
Response Headers
Age:0
Connection:keep-alive
Content-Length:727
Content-Type:text/html
Date:Wed, 05 Jan 2011 15:25:21 GMT
Server:nginx/0.7.67
Via:1.1 varnish
X-Runtime:0.001344
X-Varnish:764492621
Странно то, что он находит и загружает таблицы стилей, значки и изображения в одном и том же Корневая папка. Просто повторяю, что шрифты встроены и отлично работают с локального сервера,
Public Function GetFileLastAccessTime(ByVal FilePath As String) As Date
Dim fso As New Scripting.FileSystemObject
Dim f As Scripting.File
Set f = fso.GetFile(FilePath)
GetFileLastAccessTime = f.DateLastAccessed
End Function
Вывод для рассматриваемого файла:
?getfilelastaccesstime("SomePath")
7/30/2010 2:16:07 PM
Это значение, которое я получаю из свойств файла в Windows Exploder. Счастья.
Я портирую эту функциональность в приложение VB.Net. Новый код:
Public Function GetLastAccessTime(ByVal FilePath As String) As Date
Return IO.File.GetLastAccessTime(FilePath)
End Function
Сама простота. Вывод:
?GetLastAccessTime("SomePath")
#7/30/2010 3:16:07 PM#
Час спустя.
Обе функции работают на одном компьютере, проверяя один и тот же файл. Я также пробовал использовать класс IO.FileInfo с тем же результатом. Я проверил тысячи файлов, и все они отключились на час. Другие свойства даты для времени создания и времени последнего изменения также отключены на один час.
Помогите!
Я забыл упомянуть в исходном сообщении, часовой пояс компьютера - CST, а летнее время в настоящее время не используется эффект.
Я воспроизвел проблему в 64-битной Windows 7 и 32-битной Windows XP.
Спасибо.
Обновление 1/6/2011:
Спасибо всем, кто предложил попытаться вычислить желаемую дату по всемирному координированному времени, используя соответствующие смещения часовых поясов. Сейчас я решаю, что рисковать не стоит. Для этого конкретного бизнес-требования гораздо лучше сказать, что значение даты не такое, как вы ожидали, потому что именно так работает API. Если я попытаюсь «исправить» это, то это будет моя собственность, и я бы предпочел этого не делать.
Просто ради удовольствия я попробовал использовать старый добрый Scripting.FileSystemObject через взаимодействие. Он дает ожидаемые результаты, которые согласуются с проводником Windows, с потерей производительности примерно в 5 раз по сравнению с System.IO. Если выяснится, что мне нужно получить даты, соответствующие тому, что есть в проводнике Windows, я укусил пулю и пойдем по этому пути.
Другой эксперимент, который я пробовал, касался прямого обращения к функции GetFileTime API в kernel32 через C #:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetFileTime(
IntPtr hFile,
ref FILETIME lpCreationTime,
ref FILETIME lpLastAccessTime,
ref FILETIME lpLastWriteTime
);
Это привело к тому же поведению, что и System.IO, время в проводнике Windows отключилось на час.
Еще раз всем спасибо.