Вы пишете, что служите изображениям в виде блобов с кодировкой base64 из-за проблем с безопасностью, включая очистку.
Чтобы выполнить это требование безопасности, вы подвергаетесь значительному снижению производительности, энергии кодирования на стороне сервера, времени передачи файлов и рендеринга на клиенте.
Чтобы улучшить производительность на стороне сервера, вы можете кэшировать закодированную версию; Вы можете записать $ b64largeImage на диск в том же каталоге, проверить, существует ли он, и отправить его клиенту.
Чтобы сократить время передачи, убедитесь, что на сервере включен GZIP; это должно сжать ваши данные.
Тем не менее, производительность на стороне клиента останется проблемой - ваши изображения, скорее всего, не будут кэшироваться на клиенте, а декодирование изображений (особенно если их 40 на каждой странице) может потреблять приличное количество ресурсов ЦП (особенно на мобильных устройствах). устройства).
Затем возникает проблема, заключающаяся в том, что если браузер может декодировать изображение, а аттаксер / скребок - тоже, и они могут сохранить копию этого изображения. Таким образом, все эти усилия не на самом деле приносят вам большую секретность.
Конечно, вы можете не захотеть, чтобы третьи лица встраивали ваши изображения в их страницы, или вы можете не допустить, чтобы они легко царапали ваши изображения.
В этом случае вы можете сосредоточиться на том, чтобы URL-адреса трудно / невозможно угадать или срок их действия истек. Это повредит вашему SEO, так что это компромисс. S3 имеет URL-адреса с истекшим сроком действия, или вы можете создать службу, которая проверяет реферер для каждого запроса и обрабатывает только запросы изображений из доменов, занесенных в белый список, или создать собственную службу URL-адресов с истекающим сроком действия - но в каждом случае вы будете использовать JPEG / GIF / PNG изображения, так что вы получите небольшой размер файла и ограниченное время декодирования.
В C ++ вы можете использовать только Foo
.
В C вы должны использовать перечислять Foo
, пока вы не предоставите typedef для него.
А затем, когда вы ссылаетесь на BAR
, вы используете не Foo.BAR
, а просто BAR
. Все константы перечисления совместно используют одно и то же пространство имен (пространство имен «обычные идентификаторы», используемое функциями, переменными и т. Д.).
Следовательно (для C):
enum Foo { BAR, BAZ };
enum Foo testFunc(void)
{
return BAR;
}
Или с типом typedef
:
typedef enum Foo { BAR, BAZ } Foo;
Foo testFunc(void)
{
return BAR;
}
enum Foo
{
BAR,
BAZ
};
В C тип возвращаемого значения должен иметь enum перед ним. А когда вы используете индивидуальные значения перечисления, вы никоим образом их не квалифицируете.
enum Foo testFunc()
{
enum Foo temp = BAR;
temp = BAZ;
return temp;
}
Я считаю, что отдельные значения в перечислении
сами по себе являются идентификаторами, просто используйте :
enum Foo testFunc(){
return BAR;
}
Я думаю, что некоторые компиляторы могут потребовать
typedef enum tagFoo
{
BAR,
BAZ,
} Foo;