我正在尝试使用perl将CSV文件上传到mysql数据库。我的perl脚本将驻留在服务器上,我将通过浏览器访问该服务器。在浏览器中,将有一个上传文件的选项。
问题是,我将如何做到这一点
到目前为止,我尝试过这样做
if($update eq "fullLoad"){
$filename = param("customPricing");
my $upload_filehandle = upload("customPricing");
open ( UPLOADFILE, ">$filename" ) or die "$!";
binmode UPLOADFILE;
while ( <$upload_filehandle> )
{
print UPLOADFILE;
}
close UPLOADFILE;
$query = "LOAD DATA INFILE '\bigmac\bm_src\html\cgi-bin\testbrocade\$filename' INTO TABLE customPricingTest FIELDS TERMINATED BY ','";
$sth = $dbh->do($query) or die "SQL Error: $DBI::errstr\n";
print $sth . "Records Uploaded <br/>";
}
已编辑 - &gt;上面的代码为用户抛出错误Access Denied。我成功地能够在服务器上创建文件,但看起来我正在访问它时出错。有什么想法吗?
谢谢, Nitesh
答案 0 :(得分:1)
回答问题1:如果你正在使用LOAD DATA INFILE
,是的,服务器系统和数据库用户需要访问该文件。如果使用LOAD DATA LOCAL INFILE
,则该文件可以保留在单独的系统上,由Perl脚本运行,并且数据将在网络连接中上载。两者之间存在权限和设置差异,但无论哪种方式都表现非常好,我们没有看到在本地或远程加载数据方面存在巨大差异。
对于第二个问题,这是LOAD DATA LOCAL INFILE
的用途。这里,因为文件是通过DBI连接读取和传递的,所以文件路径需要相对于脚本运行的位置。它不需要像LOAD DATA INFILE
那样绝对。它甚至不需要是固定的路径。我们已成功使用临时文件,只要在您与数据库断开连接之后才删除文件。