如何将 dropbox 中的图片嵌入 shiny

How to embed picture from dropbox in shiny

我正在构建一个闪亮的应用程序,我希望能够显示从我的保管箱中动态选择的图片而无需下载它们。我大部分都在使用 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)

对于 none 为什么这些方法有效,有人有什么建议吗?该应用程序在 shinyapps.io 上托管和测试。那里的日志显示没有错误。

编辑 10.08: 我找到了我认为的问题的根源。闪亮的应用程序出现在网上,图片应该是这些小符号: 如果我右键单击它并按 'open image in a new tab' 它会带我到正确的图片。(实际上我更希望它带我到该图片的预览 url 而不是实际图片,所以如果现在有人如何完成此操作,请分享。)如果我改为按检查,然后查看控制台,我会看到一个错误,内容为:

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 不允许我查看图片 'remotely' 或如何称呼它。所以我还没有解决这个问题 - 我仍然不知道如何解决这个问题。

试试这个

## 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
  })

我发现这是 Dropbox 的一个已知问题,他们不允许 iframe。有一个称为嵌入器的新功能可以执行此操作,但它相当复杂。请参阅此处的讨论:https://www.dropboxforum.com/t5/Dropbox-API-Support-Feedback/Embed-dropbox-folder-in-the-a-webpage/td-p/72455 也许我最终的解决方案是切换并使用 google 驱动器或其他东西,但我会错过 rdrop2 包的功能。