Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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
PHP无法从数据库下载上载的文件,因为上载的文件名为中文_Php_Mysql_Database_File Upload_Download - Fatal编程技术网

PHP无法从数据库下载上载的文件,因为上载的文件名为中文

PHP无法从数据库下载上载的文件,因为上载的文件名为中文,php,mysql,database,file-upload,download,Php,Mysql,Database,File Upload,Download,对不起,我正在建立一个网站,可以让用户上传他们的文件(pdf)到mysql数据库 由于我已经编写了上载和下载php页面,我可以成功上载文件(pdf)和下载英文命名文件,但未能下载名称包含中文单词的文件 更具体地说,我可以下载中文命名的文件,但无法打开它。这表明文件已损坏 以下是我上传php页面的部分代码: $connect = mysqli_connect("localhost", "root", "password", "table"); if(mysqli_c

对不起,我正在建立一个网站,可以让用户上传他们的文件(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文件:

这是我上传页面的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>&nbsp;</td><td>&nbsp;</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>

競賽報告上傳
截止
請以pdf格式上傳
競賽簡報上傳
截止
請以ppt,pptx或pdf格式上傳
檢視已上傳檔案
另一方面,这是我上传页面的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>

$(文件)。准备好了吗(
函数()
{
setDateText(reportDue,“reportDueText”);
setDateText(简报到期,“简报到期文本”);
后上传();
如果(现在>报告到期)
{
$(“#uploadedReportDiv”).hide();
$(“uploadedReport”).attr(“必需”,false);
}
如果(现在>简报时间| |现在0)
{
validateReport=validateUploadedFile($(“#uploadedReport”).val(),“pdf”);
}
如果(!$(“#uploadedReportDiv”).是(“:可见”)的,则为else
validateReport=true;
如果($(“#uploadedBriefingDiv”).是(“:可见的”)&($(“#uploadedBriefing”).val().length>0)
validateBriefing=validateUploadedFile($(“#uploadedBriefing”).val(),“pdf ppt pptx”);
如果(!$(“#uploadedBriefingDiv”)为(“:可见”),则为
validateBriefing=true;
如果(!validateReport)
警报(“檔案格式錯誤,請上傳pdf格式檔案。");//警报上载错误的文件格式
如果(!validateBriefing)
警报(“檔案格式錯誤,請上傳ppt,pptx或pdf格式檔案。“”;//警报上载错误的文件格式
返回(validateReport&&validateBriefing);
}
);
}
);
函数setDateText(日期,对象ID)
{
var dateText=(date.getFullYear()-1911)+“/”+(date.getMonth()+1)+“/”+(date.getDate());
$(“#”+objectId).text(dateText);
}
函数validateUploadedFile(文件名,validExtrade)
{
var splitedArray=filename.split(“.”);
var fileExtension=splitedArray[splitedArray.length-1];
if(validexof.indexOf(fileExtension)=-1)
返回false;
其他的
返回true;
}
函数()
{
如果($.cookie(“已上载”))
{
$(“#downloadUploadedFile”).attr(“href”,“download.php”).text(“下載檔案(“+$.cookie”(“uploadedFileName”)+”);
}
}

谢谢!

可能,将二进制文件数据存储在数据库中不是一个好主意。如果您在move_uploaded_file()的帮助下将上载的文件移动到某个目录会更好PHP函数,并且只将文件名放入数据库。

从您的答案可以看出,从数据库中读取文件后,文件显然不相同,因此显然存在问题

的确,MySQL支持二进制数据类型。但是,仅仅因为您可以,并不意味着您应该这样做。MySQL一次将结果发送到客户端。因此,任何使用二进制数据解析结果集的应用程序都需要等待每一行到达后才能进行处理。此外,存储bi并没有真正的好处MySQL中没有任何数据

处理二进制数据的更好方法是将该数据存储在文件系统中,并将指向这些文件的指针存储在MySQL中。通过这种方法,您可以在处理结果集时在后台线程中实际地流式处理二进制数据

本技巧不仅适用于二进制数据,还适用于任何类型的大型数据对象。困扰二进制数据的性能问题也困扰字符数据。换句话说,结果集的任何部分都是按顺序读取的。由于二进制数据通常很大,您会更加注意它。您会同样注意到这些问题使用大字符数据。您确实需要权衡在文件系统上存储大字符数据的性能优势与在数据库中搜索该数据的能力

但是,如果您坚持将文件存储到数据库中,请确保为其使用BLOBtype字段。
请参阅相关的

下载的PDF文件包含哪些内容?您可以使用纯文本或十六进制编辑器查看它吗?如果您首先将名称更改为其他名称,例如:test,您可以打开下载的文件吗。pdf@AntoanMilkov如果我在下载时使用内容处置头更改了下载文件的名称,则该文件仍然损坏。@Pekka웃 我已经用文本编辑器、记事本++打开了下载的pdf文件,并从文件开头抓取了一小部分内容显示出来。你能告诉我如何找出错误所在吗?@J