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;

showImage.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 を使用してファイルをアップロードするために主に使用されます。では、同じ方法で画像を直接 DB に保存できないのはなぜでしょうか?

テーブルに 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

ファイルをバイナリモードで読み取る必要があります-つまり

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