6

この記事 ( http://www.r-bloggers.com/save-r-plot-as-a-blob/ )で説明されているように、readBin 関数を使用してファイルを MySQL BLOB として保存しています。

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 ではないようです。

乾杯!

4

4 に答える 4

3

これが私がこれまでに見つけた最良の解決策です。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)
}

参照: 文字列を特定の長さの部分文字列に分割する方法

于 2012-07-24T20:06:33.927 に答える
3

「貼り付け」を使用しない場合に最適です。これは、生データ ベクトルをバイナリ ファイルとして書き戻すことができない文字列に変更するためです。試す

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

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

私はあなたの質問に答えましたか?

于 2012-07-23T08:48:45.583 に答える
1

これが私の解決策です:

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)
于 2012-07-23T18:12:43.307 に答える
0

ここで、別のソリューションを追加します。まず、使用できるファイルのサイズを取得するには

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

これに加えて、MadSeb の回答により、元の質問が実際に何を目的としているのかを理解できました。2 バイトの間に「-」を追加するのは良い解決策ですが、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))))))
于 2012-07-24T02:02:10.023 に答える