Обслуживание произвольных файлов изображений через сантехник - PullRequest
0 голосов
/ 26 апреля 2018

При условии, что у меня есть сохраненный файл изображения, как мне обслуживать их через сантехника?

Например, это работает без проблем

# save this as testPlumb.R

library(magrittr)
library(ggplot2)

#* @get /test1
#* @png
test1 = function(){
    p = data.frame(x=1,y= 1) %>% ggplot(aes(x=x,y=y)) + geom_point()
    print(p)
}

и запускается

plum = plumber::plumb('testPlumb.R')
plum$run(port=8000)

и если вы перейдете к http://localhost:8000/test1,, вы увидите, что сюжет обслуживается.

Но мне не удалось найти способ обслуживания файла изображения

#* @get /test2
#* @png
test2 = function(){
    p = data.frame(x=1,y= 1) %>% ggplot(aes(x=x,y=y)) + geom_point()
    ggsave('file.png',p)

    # code that modifies that file a little that doesn't matter here

    # code that'll help me serve the file
}

Вместо code that'll help me serve the file выше, я попытался include_file, как предлагалось здесь , но это не удалось.

Поскольку часть code that modifies that file a little that doesn't matter here использует пакет magick, я также пытался обслуживать магические объекты, используя print, но это также не было успешным.

Например,

#* @get /test3
#* @png
test3 = function(){
    p = data.frame(x=1,y= 1) %>% ggplot(aes(x=x,y=y)) + geom_point()
    ggsave('file.png',p)
    fig = image_read(file)
    fig = image_trim(fig)
    print(fig) # or just fig
}

результаты в {"error":["500 - Internal server error"],"message":["Error in file(data$file, \"rb\"): cannot open the connection\n"]}

1 Ответ

0 голосов
/ 26 апреля 2018

Как описано здесь , чтобы обойти эту работу, нужно обойти стандартный сериализатор png.Таким образом, замена #* @png на #* @serializer contentType list(type='image/png') и чтение файла через readBin в конце решает проблему

#* @get /test2
#* @serializer contentType list(type='image/png')
test2 = function(){
    p = data.frame(x=1,y= 1) %>% ggplot(aes(x=x,y=y)) + geom_point()
    file = 'file.png'
    ggsave(file,p)

    readBin(file,'raw',n = file.info(file)$size)
}
...