Как вставить картинку из Dropbox в блестящую - PullRequest
0 голосов
/ 04 августа 2020

Я создаю блестящее приложение, в котором я хочу иметь возможность показывать динамически выбранные изображения из моего Dropbox без необходимости их загрузки. В большинстве случаев я использую rdrop2. Вот что у меня есть (сокращенная версия).

library(shiny)
library(shinydashboard)
library(rdrop2)
library(httr)

drop_auth(rdstoken = "token.rds")



ui <- dashboardPage(title = "digiHerb",
                    
                    dashboardHeader(),
                    
                    dashboardSidebar(),
                    
                    dashboardBody(
                      column(width=12,
                             
                      # print url (just for for troubleshooting, and the url is showing correctly)
                      box(width = NULL,
                          textOutput('path')),
                      
                      # Method 1
                      box(width = NULL,
                        htmlOutput("picture"))
                      
                      # Method 2 - iframe
                      ,
                      box(width=NULL,
                          uiOutput('myIFrame'))
                      
                      # Method 3
                      ,
                      box(width = NULL,
                        uiOutput("img"))
                      
                      #alternative method - fails with error 'cant find function GET'
                      #,
                      #box(width = NULL,
                      #    htmlOutput("includeHTML"))
                      ))
 
)
                    

server <- function(input, output, session) {
 

# get a list of the images from dropbox - they areall shared publically
shared <- drop_list_shared_links(verbose = F)
l <- length(shared$links)
sharedBefore <- data.frame()
for(i in 1:l){
  sharedBefore[i,1] <- shared$links[[i]]$name
  sharedBefore[i,2] <- shared$links[[i]]$url
}
colnames(sharedBefore) <- c("names", "url")


# using just a static entry for now (first entry) - this will become dynamic
preview <- sharedBefore[1,"url"]

output$path <- renderText(print(preview))

# Method 1
output$picture<-renderText({
   c('<img src="',
     preview,
     '">')
 })
 
# Method 2 - iframe
output$myIFrame<-renderUI({
  tags$iframe(src = preview)
})

# Method 3:
output$img <- renderUI({
   tags$img(src =  preview, width="100%")
 })
   
# Alternative method 2:
#request <- httr::GET(url=preview)
#dropB <- httr::content(request, as="text")
#output$includeHTML <- renderText({
#  dropB
#})

 
 }

shinyApp(ui = ui, server = server)

Есть ли у кого-нибудь предложения, почему ни один из этих методов не работает? Приложение размещено и протестировано на shinyapps.io. В журнале нет ошибок.

РЕДАКТИРОВАТЬ 10.08: Думаю, я нашел источник проблемы. Блестящее приложение появляется в Интернете с этими маленькими символами на месте картинок: введите описание изображения здесь Если я щелкну его правой кнопкой мыши и нажму «открыть изображение в новой вкладке», я перейду к правильному изображению (на самом деле, я бы предпочел, чтобы меня перевели на URL-адрес предварительного просмотра для этого изображения, а не на фактическое изображение, поэтому, если кто-нибудь теперь, как выполнить sh это тоже, пожалуйста, поделитесь.) Если вместо этого я нажимаю inspect, а затем просматриваю консоль, я вижу, что есть ошибка, которая гласит:

Refused to display 'https://www.dropbox.com/..........JPG?dl=0' in a frame because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' ".

Мне кажется, что dropbox не позволяя мне просматривать изображение «удаленно» или как это называть. Так что я не решил вопрос - я все еще не понимаю, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 12 августа 2020

Кажется, это известная проблема с Dropbox, которая не позволяет использовать фреймы. Есть новая функция, называемая встраивающим устройством, которая якобы делает это, но это довольно сложно. См. Обсуждение здесь: https://www.dropboxforum.com/t5/Dropbox-API-Support-Feedback/Embed-dropbox-folder-in-the-a-webpage/td-p/72455 Возможно, моим окончательным решением будет переключение и использование диска Google или что-то в этом роде, но мне не хватает функциональности пакета rdrop2.

0 голосов
/ 05 августа 2020

Попробуйте это

## replace this for loop
  for(i in 1:l){
    sharedBefore[i,1] <- shared$links[[i]]$name
    sharedBefore[i,2] <- shared$links[[i]]$url
  }
  ##  with lapply
  lapply(1:l, function(i) {
    sharedBefore[i,1] <<- shared$links[[i]]$name
    sharedBefore[i,2] <<- shared$links[[i]]$url
  })
...