1

私は perl と MongoDB::GridFS (他の mongo モジュールと一緒に) を使用して、ファイルの保存と取得を行っています。.txt では問題なく動作しますが、.docx を保存して取得したいです。これが私のコードです:

#!usr/bin/perl

use MongoDB::GridFS;
use MongoDB;
use MongoDB::Database;
use MongoDB::OID;

my $conn = new MongoDB::Connection; 
my $db   = $conn->test; #name of our local db is test...default of mongoDB
my $coll = $db->err0; #err0 is the name of the collection
my $grid = $db->get_gridfs;
my $fh = IO::File->new("wordtoyamutha.docx", "r");
$grid->insert($fh, {"filename" => "test"});

my $outfile = IO::File->new("wordtoyamutha.docx", "w");
my $file = $grid->find_one({"filename" => "test"});;
$file->print($outfile);

最初に「wordtoyamutha.docx」という .docx を作成し、最後の 3 行をコメントアウトして上記のコードを実行しました。正常に動作し、MongoDB の fs.files に新しいエントリが表示されました。次に、.docx を削除し、すべての「保存」コードをコメント アウトしてコードを実行しました。明確にするために、これらの行は上記からコメント アウトされています。

my $fh = IO::File->new("wordtoyamutha.docx", "r");
$grid->insert($fh, {"filename" => "test"});

Wordtoyamutha というタイトルの docx が表示されました...しかし、それを開こうとすると、Word が破損して読めなくなったと訴えました。

ファイルを取得する他の方法を知りません...これが Perl MongoDB::GridFS が提案するすべてです...ここでのトリックは何ですか?

Word からの正確なエラーがダイログに表示され、「コンテンツに問題があるため、ファイル wordtoyamutha を開けません」と表示されます。

4

1 に答える 1

2

そして、これが私が与えられた助けの(完全に機能する!)結果です:

#!usr/bin/perl
#Using Strawberry Perl and on Windows 7 box

use strict;
use warnings;
use MongoDB::GridFS;
use MongoDB;
use MongoDB::Database;
use MongoDB::OID;

my $conn = new MongoDB::Connection; 
my $db   = $conn->test; #name of our local db is test...default of mongoDB

my $grid = $db->get_gridfs;
my $fh = IO::File->new("cool.docx", "r");
$fh->binmode();
$grid->insert($fh, {"filename" => "docx"});

my $outfile = IO::File->new("return.docx", "w");
$outfile->binmode();
my $file = $grid->find_one({"filename" => "docx"});
$file->print($outfile);

繰り返しますが、これは優れたスクリプトではありません。ここではハードコーディングされています。これにより、「cool」というタイトルのdocxファイルがperlスクリプトと同じディレクトリから取得され、db "test"に保存されてから、perlスクリプトと同じディレクトリのreturn.docxに再度取得されます。別名return.docxがディレクトリに表示され、正確なコピーになります。これは単独ではあまり役に立ちませんが、明らかにこれができれば、もっと多くのことができることを意味します。

=======このスクリプトを機能させるために何を変更する必要がありますか?========

パラメータ名「docx」は変更可能です。これは、GridFSデータベースでファイルがアドレス指定される方法です。その後、明らかにファイル名は変更可能です。将来のユーザーは、おそらく「my$db」行も次のように変更する必要があります。

my $db   = $conn->name_of_your_DB; 

DBの名前がわからない場合は、Mongoシェルに移動して、次のように入力します。

show dbs

dbのリストが表示されます。次に、リストされているdbの1つを選択します。これをdb_you_want_to_useと呼びます。ここで入力します

use db_you_want_to_use

そして、スクリプトの$ db行を変更して、入力したものと同じもの、つまり:を指すようにします。

my $db   = $conn->db_you_want_to_use; 

GridFSでファイルを挿入すると、fs.filesというコレクションが作成されます。使用する

db.fs.files.find()

DBのエントリを表示するには-AKAで、正しく挿入されているかどうかを確認します。

于 2012-06-22T15:01:25.930 に答える