如何将 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 包的功能。
我正在构建一个闪亮的应用程序,我希望能够显示从我的保管箱中动态选择的图片而无需下载它们。我大部分都在使用 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:
我找到了我认为的问题的根源。闪亮的应用程序出现在网上,图片应该是这些小符号:
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 包的功能。