对不起,我正在建立一个网站,该网站可以让用户将其文档(pdf)上传到mysql数据库。
由于已编写了上载和下载php页面,因此可以成功上载文件(pdf)并下载以英语命名的文件,但无法下载名称包含中文单词的文件。
更具体地说,我可以下载中文命名文件,但无法打开它。它表明文件已损坏。
这是我的上传php页面代码的一部分:
$connect = mysqli_connect("localhost", "root", "password", "table");
if(mysqli_connect_errno($connect))//check connection
{
/*show error message and die*/
}
//set client character set to 'utf8'
mysqli_set_charset($connect, "utf8");
$fileName = mysqli_real_escape_string($connect, $name);
$filePath = mysqli_real_escape_string($connect, $tmp_name);
$fileSize = mysqli_real_escape_string($connect, $size);
$fileType = mysqli_real_escape_string($connect, $type);
$content = mysqli_real_escape_string($connect, file_get_contents($tmp_name));
$filePath = addslashes($filePath);
if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}
$teamName = $_COOKIE['teamName'];
$reportQuery = "UPDATE uploadedreport SET name='$fileName', type='$fileType', size='$fileSize', content='$content' WHERE team='$teamName'";
uploadFileQuery($connect, $reportQuery, $fileName);
mysqli_close($connect);
此外,下载php页面的另一部分代码是:
$teamName = $_COOKIE['teamName'];
$downloadReportQuery = "SELECT name, type, size, content FROM uploadedreport WHERE team='$teamName'";
$result = mysqli_query($connect, $downloadReportQuery);
if($result == false)
{
/*alert error message and die*/
}
$row = mysqli_fetch_array($result);
header("Content-length:$row[size]");
header("Content-type:$row[type]");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=$row[name]");//Tells the browser to save this downloaded file under the specified name
echo $row["content"];
mysqli_free_result($result);
mysqli_close($connect);
有什么事吗
我为这个问题困扰了好几天。
谢谢你的帮助!
使用记事本++打开损坏的下载的pdf文件:
little part of downloaded pdf
有我的html上传页面代码:
<div id="pageDiv">
<section id="mainSection">
<div id="mainDiv">
<form action="upload.php" method="post" enctype="multipart/form-data">
<table id="mainTable">
<tbody>
<tr>
<td class="headColumn paragraphTitle"><label for="uploadedReport">競賽報告上傳</label></td>
<td><span class="hint"><span id="reportDueText"></span>截止</span></td>
</tr>
<tr>
<td><div id="uploadedReportDiv"><input id="uploadedReport" name="uploadedReport" type="file" required /></div></td>
<td><span class="hint">請以pdf格式上傳</span></td>
</tr>
<tr>
<td class="headColumn paragraphTitle"><label for="uploadedBriefing">競賽簡報上傳</label></td>
<td><span class="hint"><span id="briefingDueText"></span>截止</span></td>
</tr>
<tr>
<td><div id="uploadedBriefingDiv"><input id="uploadedBriefing" name="uploadedBriefing" type="file" required /></div></td>
<td><span class="hint">請以ppt, pptx 或pdf格式上傳</span></td>
</tr>
<tr><td colspan="2"><input id="uploadButton" type="submit" value=""/></td></tr>
<tr><td> </td><td> </td></tr>
<tr>
<td class="headColumn paragraphTitle">檢視已上傳檔案</td>
<td><a id="downloadUploadedFile" href="#">未上傳</a></td><!-- link to download file. If user has uploaded it, href will be changed by the javascript function afterUploaded -->
</tr>
</tbody>
</table>
</form>
</div>
</section>
</div>
另一面,这是我的javascript页面上传代码:
<script>
$(document).ready(
function()
{
setDateText(reportDue, "reportDueText");
setDateText(briefingDue, "briefingDueText");
afterUploaded();
if(now > reportDue)
{
$("#uploadedReportDiv").hide();
$("#uploadedReport").attr("required", false);
}
if(now > briefingDue || now <= reportDue)
{
$("#uploadedBriefingDiv").hide();
$("#uploadedBriefing").attr("required", false);
}
$("form").submit(
function()
{
var validateReport = false;
var validateBriefing = false;
if($("#uploadedReportDiv").is(":visible") && $("#uploadedReport").val().length > 0)
{
validateReport = validateUploadedFile($("#uploadedReport").val(), "pdf");
}
else if(!$("#uploadedReportDiv").is(":visible"))
validateReport = true;
if($("#uploadedBriefingDiv").is(":visible") && $("#uploadedBriefing").val().length > 0)
validateBriefing = validateUploadedFile($("#uploadedBriefing").val(), "pdf ppt pptx");
else if(!$("#uploadedBriefingDiv").is(":visible"))
validateBriefing = true;
if(!validateReport)
alert("檔案格式錯誤,請上傳pdf格式檔案。");//alert upload wrong file format
if(!validateBriefing)
alert("檔案格式錯誤,請上傳ppt, pptx 或pdf格式檔案。");//alert upload wrong file format
return (validateReport && validateBriefing);
}
);
}
);
function setDateText(date, objectId)
{
var dateText = (date.getFullYear()-1911) + "/" + (date.getMonth()+1) + "/" + (date.getDate());
$("#" + objectId).text(dateText);
}
function validateUploadedFile(filename, validExtensions)
{
var splitedArray = filename.split(".");
var fileExtension = splitedArray[splitedArray.length-1];
if(validExtensions.indexOf(fileExtension) == -1)
return false;
else
return true;
}
function afterUploaded()
{
if($.cookie("isUploaded"))
{
$("#downloadUploadedFile").attr("href", "download.php").text("下載檔案(" + $.cookie("uploadedFileName") + ")");
}
}
</script>
谢谢!
最佳答案
从您的答案中可以很明显地看出,从数据库中读取文件后,该文件是不相同的,因此很明显那里出了问题。
MySQL确实支持二进制数据类型。但是,仅仅因为您可以,并不意味着您应该这样做。 MySQL一次将结果全部发送到客户端。因此,任何使用二进制数据解析结果集的应用程序都需要等待每一行到达,然后才能对其进行处理。此外,将二进制数据存储在MySQL中并没有真正的好处。
更好的二进制数据处理方法是将该数据存储在文件系统上,并在MySQL中存储指向这些文件的指针。使用这种方法,您实际上可以在处理结果集的同时在后台线程中传输二进制数据。
本技巧不仅适用于二进制数据;它适用于任何种类的大型数据对象。困扰二进制数据的性能问题也困扰着字符数据。换句话说,顺序读取结果集的任何部分。由于二进制数据通常很大,因此您会更加注意。对于大字符数据,您将同样注意到这些问题。您确实需要权衡在文件系统上存储大字符数据的性能优势与在数据库中搜索该数据的能力。
但是,如果您坚持将文件存储到数据库中,请确保对其使用BLOB类型字段。
参见相关的manual page here.
关于php - 由于使用中文文件名上传,PHP无法从数据库下载上传文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18777797/