Прямая ссылка на изображение в общей папке

Добрый день.
Помогите пожалуйста решить задачу.

Nextcloud 13.0.6
Ubuntu 16.04.5 LTS
Apache / 2.4.18
PHP 7.0.32

Есть папка “Site”, в ней лежат куча фотографий (*.jpg) с именами 000001.jpg, 000002.jpg, 000003.jpg и т. д.

Требуется:

  1. Расшарить папку “Site” 1 раз, а не каждую фотографию в отдельности
  2. Получить доступ к каждой фотографии по “прямой ссылке”, чтобы на Ubuntu можно было выполнить комманду wget (пример):
    # wget https://domain.com/s/P8PPk87BstqmK5o/preview/000004.jpg

Варианты, которые я попробовал:

  1. Расшаривание конкретной фотографии позволяет получить прямую ссылку.
    https://domain.com/s/P8PPk87BstqmK5o/preview
    Но автоматически подставить переменную (имя файла) 000001.jpg невозможно.

  2. Расшарить папку “Site”.
    https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg
    Но командой “wget для” такой файлик скачать невозможно, скачивается что-то другое, а не картинка:
    размером 69752762 байт.

Можно попробовать :
Для начала надо убрать все файлы картинки с папки Site и саму папку стереть.
Потом создать папку снова и Расшарить папку её ну а потом залить фотки снова .
Когда придет письмо там должны быть прямые ссылки.
Думаю что так должно получиться, хотя есть нюанс как с wget пройдёт авторизация ?
Может что-то другое нужно?
Но есть идея вроде бы!
В настройках есть вариант : Внешние хранилища и там есть FTP,SFTP, WebDAV.
Если подключить одно хранилище куда надо кидать картинки с командой wget то его можно подключить сразу туда .
Это я думаю лучший вариант.

Прямые ссылки хорошо работают только для авторизованных пользователей. Создай пользователя wget и расшарь ему папку Site. Тогда ты сможешь забирать файлы по прямой ссылке, только не забудь аторизоваться указав имя и пароль.

Все расшаренные ссылки видно в описании папки или файла, все их я перепробывал и даже те, которые находятся внутри когда уже открываешь картинку.

По поводу внешних хранилищ, тоже как вариант рассматриваю такое подключение, только немного наоборот, подключиться к webdav самого Nextcloud иначе прейдется еще лишний сервис поднимать на конечном серваке.

Да, попадалась на глаза инфа такая.
Могли бы вы описать поподробнее?
Допустим я создал отдельного пользователя. Вы предлагаете дальше качнуть клиента nextcloud и подключиться к папке? Или подключить как сетевую шару по WebDav? Каким образом я должен авторизоваться?

Если ты подводишь указатель к папке, или файлу то видишь путь типа (для примера папка Shared и файл в ней ApplicationXXXX.pdf): https://YOURSERVER/remote.php/webdav/Shared/ApplicationXXXX.pdf теперь этот путь ты можешь использовать чтоб скачать файл указав логин и пароль.

Так же ты можешь открыть “подробности” файла и там скопировать прямую ссылку на файл/папку https://YOURSERVER/index.php/f/1101783. И это тоже будет работать с wget-ом при предоставлении имени и пароля.

Для пользователя типа TEST с парлем TestPass прямая ссылка для всех пользователей что имеют доступ к файлу это будет примерно:

wget --user=TEST --password=TestPass https://YOURSERVER/index.php/f/1101783

или

wget https://TEST:TestPass@YOURSERVER/index.php/f/1101783

Или относительная работает точно по webdav, т.е. с wget-ом:

wget https://TEST:TestPass@YOURSERVER/remote.php/webdav/Shared/ApplicationXXXX.pdf

Добавлю что это работает независимо от внешняя это шара, или внутренняя NC.
Пользователя создавать тоже не обязательно, можешь пользоваться своим текущим. При двух факторной авторизации создай пароль приложения, который и скармливай wget-у.

Попробуй просто webdav подключить к NC, или его конкретной папке.

1 Like

Спасибо за подробное объяснение.
Вообще я wget привел для примера. На самом деле мне эти пути нужны для экспорта в интернет магазин из CSV файлика, в котором лежат пути до картинок.
Выводить в открытом виде логины пароли, пусть даже только для чтения не очень хочется хотя вот этот вариант очень интересен:
wget https://TEST:TestPass@YOURSERVER/remote.php/webdav/Shared/ApplicationXXXX.pdf

Благо сервак личный поэтому попробую к веб-серверу подключить по webdav NC.

И тем не менее вопрос остается открытым, до тех пор пока не удастся разработать вариант, который не будет требовать логинов и паролей и при этом можно будет запихнуть в ссылку имена файлов для того чтобы автоматически генерировать имена в CSV файлике.
Может в 14 версии есть такой механизм?

Ну так бы сразу и сказал. Тебе нужно расширить папку/файл по ссылке. Переходя по ней ты увидишь окно с содержимым и кнопку скачать. Т.е. требуется действие от пользователя, НО если добавить в конце пути (если не изменяет память)

?download

То получишь свой файл по прямой ссылке без паролей и явок. Т.е.wget https://tralala.com/blabla?download

2 ноября 2018 г. 13:44:20 GMT+01:00, AlerktroNik noreply@nextcloud.com пишет:

Я тоже как-то методом тыка нашел эту ссылку у себя и был рад, что она работает в Гугл таблицах (об этом я писал в первом посте).
Выглядит она вот так:
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg

Только проблема в том, что wget ее не может скачать. Он качает файлик с названием “download?path” … да и бог бы с названием, так и размер у этого файлика явно не картинки. И сайт соответственно тоже не может его выкачать. Я поэтому эту тему и поднял.

Есть еще идеи?

Нашел статью для подключения:
https://docs.nextcloud.com/server/13/user_manual/files/access_webdav.html#creating-webdav-mounts-on-the-linux-command-line

Запускал монтирование от root. Был нюанс, что не хотел читать пароли из файла ~/.davfs2/secrets, но из другого файла /etc/davfs2/secrets все прочитал.
Потом несколько раз примонтировалось и все было видно, через несколько подключений туда сюда начал писать ошибку типо “сервер временно недоступен” именно сервер, а не ресурс, но с серваком все было в порядке. Попытался ребутнут сервак и сервак вобще помер, я так подозреваю не смог автоматом примонтировать точку WebDav, хотя очень странно, что сервак после ребута меня пытался принудительно загнать с режим обслуживания и требовал пароль рута.

Были еще нуансы в том, что как-то долго все показывается через WebDav, помню и на винде не сильно это радовало, и куча народа на это жаловались в инете.

В понедельник буду пробовать просто установить клиента nextcloud и включить синхронизацию, пусть просто выкачивает на себя, но надо будет поиграться с путями, чтобы картинки на сайте не дублировались при импорте товаров.

Все равно идеальным вариантом остается конечно просто вариант расшарить папку 1 раз и потом получать из нее файлы по прямым ссылкам и приэтом эти ссылки были предсказуемыми и менялось только имя файла.

Если у кого-то еще есть идеи, с радостью потестирую.

Странно, если я расшариваю ссылку то получаю ссылку вида https://YOURSERVER/index.php/s/XfHKow2bMRA7YiD.
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
Я ошибся, нужно добавить /donwload, т.е. https://YOURSERVER/index.php/s/XfHKow2bMRA7YiD/download.
Вот так:

$ wget https://YOURSERVER/index.php/s/XfHKow2bMRA7YiD/download
--2018-11-02 19:53:09--  https://YOURSERVER/index.php/s/XfHKow2bMRA7YiD/download
Распознаётся YOURSERVER (YOURSERVER)... 95.95.95.95
Подключение к YOURSERVER (YOURSERVER)|95.95.95.95|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 427885 (418K) [audio/mpeg]
Сохранение в каталог: ««download»».

download                  100%[===================================>] 417,86K  2,58MB/s    in 0,2s    

2018-11-02 19:53:11 (2,58 MB/s) - «download» сохранён [427885/427885]

$ ls -la | grep OST
$ ls -la | grep download
-rw-rw-r--  1 gas  gas  427885 Nov  2 19:53 download

Проблема в том что файл теперь назывется download, а не OST_Bumer_-_Dimon.mp3. Т.е. нужно использовать ключь -O имя файла.

А так md5 сходится:
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

$ md5sum download
8622f05c366adbbb03b28b0f00820667  download

wget https://YOURSERVER/index.php/s/XfHKow2bMRA7YiD/download

downloads это не проблема, проблема в том, что я немогу автоматически генерировать эти ссылки в гугл таблицах, потомучто линк не привязан ни к какой логике, просто случайная генирация символов, а я хотел привязать генерацию к артикулу товара и просто в папку класть картинки уже с нужным именем.

По поводу наконце /download может у тебя другая версия Nextcloud? Я в первом топе свою писал.
Еще у тебя в линке есть index.php, я делал красивые линки себе … можешь погуглить pretty links nextcloud.

Про pretty links я в курсе, но не особо нужен :slight_smile:

Вот еще такая идея:
Зачем тебе линки постоянно генерировать? Создай Х файлов, скажем 10. Расшарь и получи 10 линков на них. Теперь ты можешь менять содержимое каждого из 10 файлов, а линк останется прежним. Добавляй /download в конце и будет тебе счастье.

У меня сейчас NC 14.

Если ты вообще по хардкоркору хочешь, то нужно создать хук (или парсер бота) в mysql чтоб выплевывал эти линки для тебя, или ты можешь редактировать их в БД и получать любой результат.

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

ОБНОВЕЛНИЕ:
Я нашел что ты хочешь: расшариваешь папку по ссылке и потом все файлы в ней доступны по прямой ссылке, например для OST Dimon:

https://YOURSERVER/index.php/s/X6t2BKe6zcAiegs/download?path=/&files=OST_Bumer_-_Dimon.mp3

все остальные файлы можешь качать также, меняя только последнюю часть с именем файла. Если “Димон” будет в подпапке Audio, то ссылка станет

https://YOURSERVER/index.php/s/X6t2BKe6zcAiegs/download?path=/Audio&files=OST_Bumer_-_Dimon.mp3

Все верно именно это я и хочу. Третий раз говорю, что данную ссылку понимает только Гугл Таблица.
Ни в wget, ни модуль импорта в интернет-магазин на Opencart не могут загрузить картинку по этому линку, вот я и ищу альтернативу. Качается файлик большого размера и это не картинка, а что-то другое.

Попробуй выполнить у себя команду, может в 14 версии, что-то исправили:
wget https://YARSERVER/index.php/s/X6t2BKe6zcAiegs/download?path=/Audio&files=OST_Bumer_-_Dimon.mp3

Кстати этот линк отличается от моего немного:
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg

Можешь показ откуда ты это линк получил? А то я сам на него один раз наткнулся и забыл откуда я его взял.

Короче это косяк wget-а. Он неправильно парсит запрос и скачивает всю папку целиком в zip архиве. Заключи запрос в кавычки и тогда будет тебе счастье

wget "https://YOURDOMAIN/index.php/s/Zc5tmqrp4GL3CBJ/download?path=/&files=vid-1505299662.1.jpg"

ссылки не отличаются, просто у тебя символы между path и files закодированы по другому.
Как ты обратил внимание на скриншоте имя файла не совсем приятное, но это проблема wget. Ссылку брал просто из шары (т.е. открыл расшаренную папку по ссылке в приватном окне):


Если вставить в браузер то картинка откроется на отлично по прямому пути.

1 Like

Да, действительно wget качает, но когда я обрамляю весь путь в кавычки и гугл таблицы и модуль импорта вообще перестает воспринимать путь как ссылку на картинку. Я вот подумал есть же спец символы типо слеша или коды символов, которые могли позволить обрамлять не всю ссылку в кавычки, а только эти спецсимволы ?=&%
Т. е. вместо ссылки
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg
или ссылки с кавычками:
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg
получить ссылку без спецсимволов, а точнее их точечным выделением, чтобы начало и конец ссылки не изменилось, т. е. остался виден протокол https и конец . jpg:
https://domain.com/s/b37j9Lxi9LkR4ft/download\?path\=\%2F\&amp\;files=000001.jpg

Только я не знаю как этого добиться.
Может ты подсказать сможешь?

Это уже не топик данного форума. Я не знаю хорошо гугл таблицы и как там экранировать символы не подскажу, но ссылка строится так:

  1. https://domain.com/s/b37j9Lxi9LkR4ft/ - постоянная часть ведет на расшаренные ресурс
  2. download - указание к действию, а не открытию списка файлов (как в браузере).
  3. ? - разделитель
  4. path=/ - указатель пути, в данном случае root, если есть подпапки, типа TEST, будет path=/TEST
  5. & - разделитель в твоих примерах закодирован вместе со слэшем как %2F&
  6. files=000001.jpg - конкретный ресурс/картинка.

В твоём конкретном примере пункту 1-5 являются постоянными, только 6ой менятеся и то заранее известен.

Попробуй поискать: https://duckduckgo.com/?q=url+decode+online, например ? будет %3F. Вообще говорят curl творит чудеса.

1 Like

Я не про гугл таблицы, я говорил про php, т. к. модуль, которым я пользуюсь написан на php.

Спасибо за помощь, завтра буду играться, чтоже не нравится php модулю и как ему скормить этот путь чтобы он не скачивал целый архив папки аналогично wget без использования ковычек.

https://domain.com/s/b37j9Lxi9LkR4ft/download скачает полный архив папки. Только без дополнительных параметров wget оставит имя файла download, так что переименуй его в files.zip и все, или открывай как архив напрямую.

Данный вариант не подходит, мне нужная прямая ссылка на картинку.

Поробовал закодировать & в %26 тоже не помогает
Вместо ссылки
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F&files=000001.jpg”
Получилась ссылка
https://domain.com/s/b37j9Lxi9LkR4ft/download?path=%2F%26files=000001.jpg
ERROR 404: Not Found

Продолжу искать дальше.