Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
使用perl解码MIME中的附件时出错_Perl_Mime - Fatal编程技术网

使用perl解码MIME中的附件时出错

使用perl解码MIME中的附件时出错,perl,mime,Perl,Mime,我用perl编写了一个脚本,使多部分MIME消息附加一个图像这里是脚本 use MIME::Parser; use FileHandle; $ffh = FileHandle->new; if ( $ffh->open(">m2.txt") ) { #print <$fh>; } ### Create an entity: $top = MIME::Entity->build( From => 'me@myhost.com',

我用perl编写了一个脚本,使多部分MIME消息附加一个图像这里是脚本

use MIME::Parser;
use FileHandle;

$ffh = FileHandle->new;
if ( $ffh->open(">m2.txt") ) {

    #print <$fh>;
}

### Create an entity:
$top = MIME::Entity->build(
    From    => 'me@myhost.com',
    To      => 'you@yourhost.com',
    Subject => "Hello, nurse!",
    Data    => "How are you today"
);

### Attach stuff to it:
$top->attach(
    Path     => "im.jpg",
    Type     => "image/jpg",
    Encoding => "base64"
);

### Output it:
$top->print($ffh);
使用MIME::Parser;
使用文件句柄;
$ffh=文件句柄->新建;
如果($ffh->open(“>m2.txt”)){
#印刷品;
}
###创建实体:
$top=MIME::实体->构建(
From=>'me@myhost.com',
To=>'you@yourhost.com',
主题=>“你好,护士!”,
Data=>“你今天好吗?”
);
###附加内容:
$top->attach(
Path=>“im.jpg”,
Type=>“image/jpg”,
编码=>“base64”
);
###输出它:
$top->print($ffh);
之后,我尝试使用以下代码解析从上述脚本生成的输出消息

use MIME::Parser;
use FileHandle;

$fh = FileHandle->new;
if ( $fh->open("<m2.txt") ) {

    #print <$fh>;
}

### Create parser, and set some parsing options:
my $parser = new MIME::Parser;
$parser->output_to_core(1);

### Parse input:
$entity = $parser->parse($fh) or die "parse failed\n";

print $entity->head->get('subject');
print $entity->head->get('from');

print $entity->head->get('to');
print $entity->head->get('cc');
print $entity->head->get('date');
print $entity->head->get('content-type');

my $parts = $entity->parts(1);
my $body  = $parts->bodyhandle;
print $parts->head->get('content-type');

$ffh = FileHandle->new;
if ( $ffh->open(">C:/Users/Aamer/Desktop/im.jpg") ) {
    $body->print($ffh);
}
使用MIME::Parser;
使用文件句柄;
$fh=文件句柄->新建;
如果($fh->open(“C:/Users/Aamer/Desktop/im.jpg”)){
$body->print($ffh);
}

现在,所有东西都正确解析并返回正确的值,除了作为附件的输出图像,图像有些损坏,我试图对它们进行十六进制比较提取的图像和原始图像之间有一些差异,有人能告诉我这里出了什么问题吗?谢谢

您的路径名表明您在Windows上,默认情况下Perl以文本模式打开文件。这意味着在写入文件时,它会将图像中每次出现的0x0A(LF)转换为0x0D 0x0A(CRLF),从而损坏图像

以二进制模式打开文件:

$ffh->open("C:/Users/Aamer/Desktop/im.jpg", "wb")

是否在附加文件之前关闭文件句柄?可能是缓冲问题。关闭文件句柄会将数据刷新到文件中。

非常感谢,问题与您所说的完全一样,尽管“wb”在windows上对我不起作用。binmode($ffh)为我工作。只是为了将来的帮助而分享这个,但是非常感谢
“wb”
应该可以。添加
“wb”
时,是否从文件名前面删除了