Как скриптом прикрепить фотографию к сообщению?
Мне нужно PHP скриптом прикрепить фотографию в ответ пользователю. Я думал, что есть такая возможность в методе messages.send, там есть параметр attachment, но он позволяет прикрепить фотографию, которая уже существует на серверах ВК. Моя цель от определенного сообщения ответить нужной картинкой, которая находится у меня на сервере, соответственно грузить картинку будет скрипт, а не я. Я нашел метод photos.getUploadServer, но тут беда в том, что тут должна быть форма для загрузки фотографий, которую придется отправить запросом Post. Как ее скрипт то заполнит и отправит? Не знаю как поступить в данной ситуации. P.S. В ВК еще есть фишка, которая может прикрепить фотографию по ссылке. Я так обычно делаю, кидаю ссылку на фотографию в диалог, и фотография через секунду прикрепляется. Тут я хотел также сделать, хотя понимал что скорее всего не выйдет. Даже делал sleep(3), чтоб фотография прогрузилась на всякий случай, но кидается просто ссылка на картинку. Как поступить?
Отслеживать
8,602 4 4 золотых знака 30 30 серебряных знаков 53 53 бронзовых знака
задан 24 фев 2017 в 1:40
115 1 1 серебряный знак 9 9 бронзовых знаков
Гляньте, как загружать фотографии к записям на стене. С сообщениями всё точно также, разве что названия методов понятным образом различаются. Подробнее в документации.
24 фев 2017 в 19:30
А если попробовать отправить сначала картинку себе в личные сообщение, а потом от туда переслать пользователю методом messages.send с параметром forward_messages.
stream_filter_append
Добавляет filtername в список фильтров, прикреплённых к stream .
Список параметров
По умолчанию stream_filter_append() будет прикреплять фильтр к цепочке фильтров чтения , если файл был открыт для чтения (т. е. режим файла: r , и/или + ). Фильтр также будет прикреплён к цепочке фильтров записи , если файл был открыт для записи (т. е. режим файла: w , a , и/или + ). Константы STREAM_FILTER_READ , STREAM_FILTER_WRITE и/или STREAM_FILTER_ALL также могут быть переданы в параметре read_write , чтобы переопределить это поведение.
Этот фильтр будет добавлен с указанными params к концу списка и, таким образом, будет вызван последним в списке потоковых операций. Чтобы добавить фильтр в начало списка, используйте stream_filter_prepend() .
Возвращаемые значения
Возвращает ресурс в случае успешного выполнения или false при неудаче. Ресурс должен быть использован для ссылки на этот экземпляр фильтра во время вызова stream_filter_remove() .
Вернёт false , если stream не является ресурсом или если filtername не найден.
Примеры
Пример #1 Контроль применения фильтров
/* Открываем тестовый файл для чтения и записи */
$fp = fopen ( ‘test.txt’ , ‘w+’ );
?php
/* Прикрепляем фильтр ROT13 к
* цепочке фильтров записи, но не к
* цепочке фильтров чтения */
stream_filter_append ( $fp , «string.rot13» , STREAM_FILTER_WRITE );
/* Запишем простую строку в файл
* она будет преобразована при помощи ROT13
* на выходе */
fwrite ( $fp , «This is a test\n» );
/* Назад к началу файла */
rewind ( $fp );
/* Прочитаем содержимое файла.
* Если фильтр также был бы прикреплён к
* цепочке фильтров чтения, мы бы увидели
* преобразованный при помощи ROT13 текст в исходном состоянии */
fpassthru ( $fp );
Примечания
Замечание: При использовании пользовательских фильтров
Сначала должна быть вызвана функция stream_filter_register() для того, чтобы зарегистрировать желаемый пользовательский фильтр на имя filtername .
Замечание: Потоковые данные читаются из ресурсов (как локальных, так удалённых) по кускам, и любые невостребованные данные сохраняются во внутренних буферах. Когда новый фильтр добавляется в конец потока, то данные во внутренних буферах обрабатываются через новый фильтр. Это отличается от поведения функции stream_filter_prepend() .
Замечание: Когда фильтр добавляется для чтения и записи, создаются два экземпляра фильтра. Функция stream_filter_append() должна быть вызвана дважды с STREAM_FILTER_READ и STREAM_FILTER_WRITE чтобы получить оба ресурса фильтра.
Смотрите также
- stream_filter_register() — Регистрирует потоковый фильтр, определённый пользователем
- stream_filter_prepend() — Прикрепляет фильтр к потоку
- stream_get_filters() — Получить список зарегистрированных фильтров
Improve This Page
User Contributed Notes 5 notes
8 years ago
Note that stream filters applied to STDOUT are not called when outputting via echo or print.
This is easily demonstrated with the standard ROT13 filter:
stream_filter_append ( STDOUT , «string.rot13» );
print «Hello PHP\n» ;
// Prints «Hello PHP»
fprintf ( STDOUT , «Hello PHP\n» );
// Prints «Uryyb CUC»
?>
If you want to filter STDOUT, you may have better luck with an output buffering callback added via ob_start:
http://php.net/manual/en/function.ob-start.php
At the time of this writing, there is an open PHP feature request to support echo and print for stream filters:
https://bugs.php.net/bug.php?id=30583
15 years ago
While using compression filters on a large set of files during one script invocation i’ve got
Fatal error: Allowed memory size of xxx bytes exhausted
even when my max memory limit settings was insane high (128MB)
Workaround is to remember to remove filter after work done with stream_filter_remove:
foreach( $lot_of_files as $filename )
<
$fp = fopen ( $filename , ‘rb’ );
$filter_params = array( ‘level’ => 2 , ‘window’ => 15 , $memory => 6 );
$s_filter = stream_filter_append ( $fp , ‘zlib.deflate’ , STREAM_FILTER_READ , $filter_params );
// here stream-operating code
18 years ago
The difference betweem adding a stream filter first or last in the filte list in only the order they will be applied to streams.
For example, if you’re reading data from a file, and a given filter is placed in first place with stream_filter_prepend()the data will be processed by that filter first.
This example reads out file data and the filter is applied at the beginning of the reading operation:
/* Open a test file for reading */
$fp = fopen ( «test.txt» , «r» );
/* Apply the ROT13 filter to the
* read filter chain, but not the
* write filter chain */
stream_filter_prepend ( $fp , «string.rot13» ,
STREAM_FILTER_READ );
// read file data
$contents = fread ( $fp , 1024 );
// file data is first filtered and stored in $contents
echo $contents ;
fclose ( $fp );
?>
On the other hand, if stream_filter_append() is used, then the filter will be applied at the end of the data operation. The thing about this is only the order filters are applied to streams. Back to the example, it’s not the same thing removing new lines from file data and then counting the number of characters, than performing the inverse process. In this case, the order that filters are applied to stream is important.
This example writes a test string to a file. The filter is applied at the end of the writing operation:
/* Open a test file for writing */
$fp = fopen ( «test.txt» , «w+» );
/* Apply the ROT13 filter to the
* write filter chain, but not the
* read filter chain */
stream_filter_append ( $fp , «string.rot13» ,
STREAM_FILTER_WRITE );
/* Write a simple string to the file
* it will be ROT13 transformed at the end of the
stream operation
* way out */
fwrite ( $fp , «This is a test\n» ); // string data is
first written , then ROT13 tranformed and lastly
written to file
/* Back up to the beginning of the file */
rewind ( $fp );
$contents = fread ( $fp , 512 );
fclose ( $fp );
echo $contents ;
?>
In the first case, data is transformed at the end of the writing operation, while in the second one, data is first filtered and then stored in $contents.
With Regards
Hossein
Пишем фотоальбом на PHP
В предыдущих уроках мы с вами писали систему авторизации на PHP и скрипт для загрузки файлов на сервер. В этом уроке мы с вами объединим эти умения в единую систему и создадим фотоальбом.
Это будет веб-приложение, в котором после авторизации можно загружать новые фото, а все остальные пользователи смогут видеть список фоток, а также просматривать каждую фотографию отдельно.
Мы будем расширять уже созданную нами ранее систему авторизации, её исходный код до начала изменений вы можете скачать тут.
Создадим также файл upload.php из прошлого урока и папку upload. Должно получиться вот так.
- PHP-разработчик 100000₽ — 180000₽
- Разработчик PHP До 15000₽
- PHP-разработчик (Bitrix) До 200000₽
- Middle PHP разработчик 150000₽ — 250000₽
- Php разработчик Зарплата договорная
Загружать картинки может только авторизованный пользователь
Теперь давайте сделаем так, чтобы upload.php мог использовать только авторизованный пользователь.
Для этого в начале скрипта добавим проверку того, что пользователь авторизован:
Этим мы просто не допустим загрузку файла на сервер. Помимо этого в upload.php нужно неавторизованному пользователю вообще не показывать форму для загрузки файлов. Проще простого, добавляем ещё одно условие:
. Загрузка файла Авторизуйтесь Добро пожаловать, | Выйти
Отлично, теперь загружать файлы можно только после логина.
- Привет, мир!
- Развернуть строку
- Чётные числа
- Числа Фибоначчи
Список фотографий
Давайте теперь сделаем страничку с выводом списка фотографий. Для этого мы изменим файл index.php.
Для начала давайте загрузим с помощью upload.php несколько фоток. Я взял картинки с котиками, назвал их 1.jpg, 2.jpg, 3.jpg и загрузил их через формочку. После этого они появились в папке uploads.
Так как наши фоточки сохраняются в папку uploads, то из неё и будем формировать наш список.
В домашнем задании к одному из прошлых уроков вы должны были познакомиться с функцией scandir(). Она возвращает список файлов в директории в виде массива.
Давайте запишем в файл index.php следующий код:
Теперь запустим скрипт в браузере и увидим следующее:
. и .. – это текущая директория и родительская директория соответственно. А вот всё остальное – это наши файлы.
Давайте сформируем список ссылок на наши картинки. Пройдёмся по массиву с именами файлов и приклеим перед их именами текст http://myproject.loc/uploads/, а ещё нам нужно проигнорировать папки . и ...
$files = scandir(__DIR__ . '/uploads'); $links = []; foreach ($files as $fileName) < if ($fileName === '.' || $fileName === '..') < continue; >$links[] = 'http://myproject.loc/uploads/' . $fileName; > var_dump($links);
Теперь в $links лежат прямые ссылки на все наши загруженные картинки.
Остаётся только вывести превьюшки!
Фотоальбом $links[] = 'http://myproject.loc/uploads/' . $fileName; > foreach ($links as $link):?>
Полюбуемся на результат.
Остаётся только добавить ссылки, чтобы при клике на картинки открывалась исходная фоточка.
Вот и всё! Полный исходный код текущего состояния доступен здесь. А изменения, которые были произведены в данном уроке, можно наглядно рассмотреть вот здесь.
Как работает система вывода изображений на сайт?
Ну например пользователь хочет загрузить изображение, это изображение сначала помещается в специальную папку для фото, а в базе данных должна храниться ссылка на это фото, а потом через базу данных выводится ссылка (тоесть само фото), я правильно понял?
Если да, то как осуществляется загрузка самого файла? Просто я знаю как взять через html-форму ссылку на файл, а вот как загрузить именно сам файл не знаю
- Вопрос задан более трёх лет назад
- 176 просмотров
2 комментария
Оценить 2 комментария