2

我正在尝试在数据库中插入图像。该数据库有一个名为的字段images,其类型为 BLOB。我正在尝试插入图像,但只存储了前 2.2KB。即使我插入另一个图像,它也只在数据库中存储 2.2KB。

当我尝试在我的应用程序中显示此图像时,它没有显示;它只是一个小图标,而不是图像。如何以正确的方式插入图像?

use CGI;  
my $file = $q->param("file"); 
$file = 'C:/wamp/bin/apache/apache2.2.22/cgi-bin/images/2.jpg';
open(my $fh, $file);
my $data;
binmode($fh);
read($fh, $data, (stat($fh))[7]);
close($fh);

my $Data = {
        table    =>'student',
        data     => {    
        Image    => $fh,
        }       
};

Data::Insert($Data);

print $q->header;
print $q->start_html(
   -title => "student",
);

print $q->end_html;

显示图像.pl

my $q = new CGI();
my $handle = Dbm::connection();

$id = $q->param('id_person');

$getimage = $handle->selectrow_array (<<SQLEOF); 
    SELECT Image
      FROM student  
    WHERE ID  = '$id'
SQLEOF

print "Content-Type: image/jpeg\n";
print "Content-length: \n\n";

binmode STDOUT;
print STDOUT $getimage;
4

3 回答 3

1

我的建议是使用图像的 MIME 类型将图像作为 base 64 加密到数据库。当您需要它时,只需说出 MIME 类型即可对其进行解密。这是最常用于使用 ajax 上传文件的方法。那么为什么我们不能用同样的方式将图像直接存储到数据库呢?

只需提供一个附加列以将 MIME 类型保留在表中,并将其与编码数据一起打印。

从文件扩展名中,我们可以识别文件的类型。图像的 MIME 类型主要是

image/gif: GIF image
image/jpeg: JPEG JFIF image;
image/pjpeg: JPEG JFIF image; 
image/png: Portable Network Graphics;
image/svg+xml: SVG vector image;
image/tiff: Tag Image File Format (only for Baseline TIFF);

您可以通过将名称指定为 来创建新列mime_typ。现在,当您使用 base 64 加密对文件进行加密时,请将其保存为字符串,就像我们将用户名和密码存储在表中一样。同样添加MIME typemime_typ列。当您要显示图像时,将其解码后的加密内容与MIME类型的内容一起打印,该内容存储在mime_typ列的同一行中。You can search google for the way to show an image which is encrypted in base 64 encryption.

于 2013-08-05T19:42:04.633 回答
0

You need to read the file in binary mode - i.e.

open(my $fh, $myfile);
my $data;
binmode($fh);
read($fh, $data, (stat($fh))[7]);
close($fh);
于 2013-08-05T18:55:02.517 回答
0

我不确定您为什么从问题中删除了数据库插入代码,但我在修订历史中找到了它。

问题可能是因为您没有使用绑定变量,并且二进制图像包含导致问题的转义字符。

我建议使用DBIx::Simple来帮助创建插入语句,这将有助于为您创建绑定变量。DBIx::Simple 适用于 SQL::Abstract 和 SQL::Interp。我发现 SQL::Interp 更灵活。

您将文件句柄插入图像字段而不是文件数据似乎也是一个错误。尝试添加use File::Slurp(您可能需要安装),然后将其放入您的%data哈希中:

 Image    =>  scalar read_file($file, { binmode => ':raw' });

您的 SELECT 语句也容易受到 SQL 注入攻击,因为您在将外部输入传递给数据库之前没有验证它,并且您没有再次绑定变量。使用DBIx::Simple,相同的代码将如下所示:

my $db = DBIx::Simple->new($handle);
$getimage = $db->iquery("SELECT Image FROM student WHERE ID  = ",\$id)->list;

另外,我建议省略 Content-Length 标头,或正确计算它,而不是让它处于无效状态。

于 2013-08-05T23:47:03.480 回答