2012-07-23 35 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

相關問題