Perl,GridFS和存储/恢复.docx文件

时间:2012-06-21 20:24:33

标签: perl mongodb gridfs

我正在使用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,然后运行上面的代码并注释掉最后三行。它运行良好,我的MongoDB fs.files中出现了一个新条目。然后我删除了.docx运行代码,所有“存储”代码被注释掉 - 显式这些行从上面注释掉了:

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

docx出现了标题词toyamutha ...但是当我试图打开它时,Word抱怨说它通过腐败变得难以理解。

我不知道有任何其他方法来检索文件......这就是所有perl MongoDB :: GridFS建议做的......这里的诀窍是什么?

来自Word的确切错误出现在dailog中并说“文件wordtoyamutha无法打开,因为内容存在问题”。

1 个答案:

答案 0 :(得分: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);

同样,这不是一个很棒的剧本 - 事情在这里硬编码。这将从与perl脚本相同的目录中提取一个标题为“cool”的docx文件,将其存储在我的db“test”中,然后在与perl脚本相同的目录中再次检索 < / strong> as return.docx。 AKA return.docx将出现在目录中并且是一个精确的副本!这本身并不是很有用 - 但显然如果我们能做到这一点,就意味着我们可以做得更多。

=======我需要改变什么才能让这篇文章为我工作?========

参数名称“docx”是可更改的 - 它是如何在GridFS数据库中寻址文件。然后显然文件名是可变的。未来的用户可能不得不将“my $ db”行更改为

my $db   = $conn->name_of_your_DB; 

如果您不知道数据库的名称是什么,请进入Mongo shell,输入

show dbs

它给出了一个dbs列表。现在选择列出的dbs之一 - 我们称之为db_you_want_to_use。现在输入

use db_you_want_to_use

并将脚本中的$ db行更改为指向您刚输入的相同内容,AKA:

my $db   = $conn->db_you_want_to_use; 

在使用GridFS插入文件时,它会创建一个名为fs.files的集合。使用

db.fs.files.find()

查看数据库中的条目 - AKA以检查是否正确插入了内容。