Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将ActiveRecord二进制blob解包为十六进制字符串将删除转义字符(“%25”转换为“%”)_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 将ActiveRecord二进制blob解包为十六进制字符串将删除转义字符(“%25”转换为“%”)

Ruby on rails 将ActiveRecord二进制blob解包为十六进制字符串将删除转义字符(“%25”转换为“%”),ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个RubyonRails应用程序,它接受二进制文件上传,将其作为ActiveRecord对象存储在本地数据库中,并将二进制blob的十六进制等价物传递给后端web服务进行处理。这通常效果很好 两天前,我遇到了一个文件问题,该文件包含ASCII格式的十六进制序列\x25\x32\x35,%25。文件的二进制表示形式已正确存储在数据库中,但由于 sample.binary.unpack('H*').to_s 这是不正确的。在调查之后,我发现这三个字节被转换成十六进制字符串25,即%的表示形式

我有一个RubyonRails应用程序,它接受二进制文件上传,将其作为ActiveRecord对象存储在本地数据库中,并将二进制blob的十六进制等价物传递给后端web服务进行处理。这通常效果很好

两天前,我遇到了一个文件问题,该文件包含ASCII格式的十六进制序列\x25\x32\x35,%25。文件的二进制表示形式已正确存储在数据库中,但由于

sample.binary.unpack('H*').to_s
这是不正确的。在调查之后,我发现这三个字节被转换成十六进制字符串25,即%的表示形式。它应该是253235,代表25%

Ruby、Rails或ActiveRecord这样做是有意义的25是%的正确URL编码值。但是,我需要关闭此优化或验证或其他功能。我需要blob.unpack'H*'为blob的每个字节包含一个十六进制等价物

解决此问题的一种低效方法是在数据库中存储文件的十六进制表示形式。直接从HTTP POST请求获取文件可以正常工作:

params[:sample].read.unpack('H*').to_s 
它存储完整的数据。从前端web服务到WEBrick中托管的后端web服务的数据库sqlite或HTTPClient post的往返导致了保真度的损失


渴望听到任何想法,愿意尝试任何方法来验证建议。谢谢。

这是rails及其sqlite适配器的一个已知问题:

在旧的rails系统中有一个bug,它的补丁是:

在新的rails问题跟踪系统中发现了一个新的bug:

任何包含“%00”的字符串在转换为二进制并返回时都将被损坏。包含字符串“%25”的二进制文件将转换为您看到的“%”