2012-07-23 36 views
3

我使用的readBin功能保存文件例如MySQL BLOB如本文(http://www.r-bloggers.com/save-r-plot-as-a-blob/R:readBin和writeBin(用于存储/检索的MySQL的BLOB或LONGBLOBs)

plot_binary <- paste(readBin("temp.png", what="raw", n=1e6), collapse="") 

我的问题是在所描述: 一旦这在数据库中,我如何将它转储回文件?

> f = file ("backIntoFile.png", "wb") 
> writeBin(object = plot_binary, con = f) 
> close(f) 

这是行不通的;该文件似乎并不是一个有效的PNG;

CHeers!

回答

1

这里是最好的我迄今发现的解决方案。 DbDownloadImages函数需要很短的时间来执行(实际上几乎没有时间)。

# Helper function I use 
Paste <- function(string, vals) 
{ 
    string <- gsub(x = string, pattern = '\\?', replacement = "%s") 
    result <- do.call(sprintf, as.list(c(string,vals))) 
    return(result) 
} 
# conn is a RMySQL connection object 
DbInsertImage <- function(conn, link.to.file) 
{ 

     binary = readBin (link.to.file , what = "raw", n = 1e6) 
     binary.str = paste (binary, collapse = "") 
     statement = Paste ("CALL InsertImage('?')" , c(binary.str)) 
     dbSendQuery(conn, statement) 
     return(GetIdentity(conn)) # one of my helper functions ; 
      # it returns the "LAST INSERT ID" 
} 

#conn is a RMySQL connection object 
DbDownloadImage <- function(conn, id, destination) 
{ 

    query = "SELECT Data FROM Image WHERE Id = ? LIMIT 1" 
    query = Paste(query, c(id)) 
    result = dbGetQuery(conn, query)$Data[1] 

    sst <- strsplit(result, "")[[1]] 
    result <- paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)]) 
    result <- as.raw (as.hexmode (result)) 

    f = file (destination, "wb") 

    writeBin(object = result, con = f) 
    close(f) 
} 

另见: How to split a string into substrings of a given length?

2

最好如果你不使用“粘贴”,因为它会将原始数据向量更改为无法作为二进制文件写回的字符串。尝试

plot_binary <- readBin("temp.png", what="raw", n=1e6) 

> f = file ("backIntoFile.png", "wb") 
> writeBin(object = plot_binary, con = f) 
> close(f) 

我回答了您的问题吗?

+0

嘿,这部分地回答我的问题;现在唯一的问题是我需要它是一个字符串,以便将它作为BLOB插入到MySQL中; :-( – MadSeb 2012-07-23 17:39:20

0

这里是我的解决方案:

binary.string <- paste(readBin("temp.png", what="raw", n=1e6), collapse="-") 
  • 保存此客体到数据库的BLOB

如何从数据库下载后为PNG重新保存吗?

> split = strsplit (binaryString, split = "-") 
> split = unlist (split) 
> back.to.binary = as.raw (as.hexmode (split)) 
> f = file ("backIntoFile.png", "wb") 
> writeBin(object = back.to.binary, con = f) 
> close(f) 
0

好的,我在这里添加另一种解决方案。首先,要获得该文件的大小,你可以使用

sz <- as.integer(system("stat --format %s temp.png", intern=T)) 

除此之外,MadSeb的回答让我明白了原来的问题确实什么。添加“ - ”两者之间字节一个很好的解决方案,但是,如果你有节省1/3的磁盘空间,这里是一个笨方法:(它需要很长的时间)

plot_binary <- paste(readBin("temp.png", what="raw", n=1e6), collapse="") 
theBinary <- unlist(lapply((1:(nchar(plot_binary)/2))*2, function(i)return(as.raw(as.hexmode(substr(plot_binary,i-1,i)))))) 
+0

感谢这个解决方案;我找到了一个有很好执行时间的解决方案;我在下面发布它;干杯! – MadSeb 2012-07-24 20:29:36

相关问题