上传表单:可以上传纯文本 .txt 文档,但不能上传 .docx 或 PDF...?

Posted

技术标签:

【中文标题】上传表单:可以上传纯文本 .txt 文档,但不能上传 .docx 或 PDF...?【英文标题】:Upload form: can upload plain text .txt document but not .docx or PDF...? 【发布时间】:2013-02-15 23:15:36 【问题描述】:

感谢有这个机会提问。我已广泛搜索答案,但找不到。我希望你们能提供一些关于为什么会出现这个问题的见解。

难题:我设置了一个表单来上传文档,以便我网站的访问者可以提交文章以供审阅。该表单曾经适用于所有指定的文件扩展名,docx、.txt、PDF 等。但是,如果有人尝试上传除 .txt 以外的任何其他格式(奇怪的是,这些格式正常)。我检查了主机提供商,错误日志中没有记录任何内容。

以下是有问题的相关代码:

function saveUploadedFile() 
$allowedExts = array("pdf", "txt", "doc", "docx", "dot");
$extension = end(explode(".", $_FILES["cFile"]["name"]));

if (   (($_FILES["file"]["type"] == "application/pdf")
        || ($_FILES["cFile"]["type"] == "application/plain")
        || ($_FILES["cFile"]["type"] == "text/plain")
        || ($_FILES["cFile"]["type"] == "application/msword"))
        && in_array($extension, $allowedExts)) 

    if ($_FILES["cFile"]["error"] > 0) 
        return '';
     else 
        $fileName = $_FILES["cFile"]["name"];
        return $fileName;
    


return '';


// Write for us form
    else if (isset($_FILES['cFile']['name'])) 
        if ((isset($_POST['cName']) && !empty($_POST['cName']))
                && (isset($_POST['cEmail']) && !empty($_POST['cEmail']) &&     isValidEmail($_POST['cEmail']))
                && (isset($_POST['cMessage']) && !empty($_POST['cMessage']))
                && !empty($_FILES['cFile']['name'])) 

            $cName = $_POST['cName'];
            $cEmail = $_POST['cEmail'];
            $cMessage = $_POST['cMessage'];
            $fileName = saveUploadedFile();

            if ($fileName != '') 
                $to = 'contact@REMOVED.com';
                $subject = 'Article';
                $msg = 'Author: ' . $cName . "\n" . 'Message: ' . $cMessage;


                $fileSize = $_FILES['cFile']['size'];
                $handle = fopen($_FILES['cFile']['tmp_name'], 'r');
                $content = fread($handle, $fileSize);
                fclose($handle);

                $content = chunk_split(base64_encode($content));
                $uid = md5(uniqid(time()));

                $headers = "From: " . $cName . " <" . $cEmail . ">
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=\"" . $uid . "\" 

This is a multi-part message in MIME format. 
--" . $uid . "
Content-Type: application/octet-stream; name=\"" . $fileName . "\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=\"" . $fileName . "\"

" . $content . "

--" . $uid . "
Content-type:text/plain; charset=iso-8859-1 
" . $msg . "
--" . $uid . "--";

                if (!@mail($to, $subject, $msg, $headers)) 
                    echo '<p class="failed validation">The e-mail could not be sent.     Please try again later</p>';
                 else 
                    echo '<p class="success validation">Your message has been sent</p>';
                
             else 
                echo '<p class="failed validation">Your file could not be uploaded.  Please make sure that you attached one of the following types of files: a plain text file, a MS Word document, a PDF file or a zip file</p>';
            
         else 
             echo '<p class="failed validation">Your file could not be uploaded.  Please make sure you have completed all required fields and that you have provided a valid email address.</p>';
        
    

这是显示的错误消息:“您的文件无法上传。请确保您附加了以下类型的文件之一:纯文本文件、MS Word 文档、PDF 文件或 zip 文件"

为什么此代码将接受 .txt 文件而不接受 .docx 或 PDF?

谢谢!

【问题讨论】:

您应该回显$_FILES["file"]["type"],并在上传失败期间查看该变量中的内容。 我不知道该怎么做,因为网站已经上线了.. 【参考方案1】:

我在某处读到 ["type"] 效果不佳。我建议删除那部分代码。

【讨论】:

嗨 Ani,你的意思是我应该删除它声明 '["type"] 的部分或进一步更改代码? 去掉类型检查就可以了。【参考方案2】:

我认为你应该编辑你的代码如下:

if (in_array($extension, $allowedExts)) 
    if ($_FILES["cFile"]["error"] > 0) 
        return '';
     else 
        $fileName = $_FILES["cFile"]["name"];
        return $fileName;
    

【讨论】:

谢谢,我已经做了现场测试;代码运行良好并且可以识别数据类型,但是当涉及到这部分 '($_FILES["file"]["type"] == "application/pdf")' 时,与 PDF 相比它显示为 false (因此显示错误消息)。似乎与标准不一致或什么?请帮忙!谢谢你! 正如 Ani $_FILES['file']['type'] 已经提到的,这不是识别文件类型的非常可靠的方法。在这种情况下,我猜您的 test-pdf 返回的文件类型略有不同。您可以echo 上传的 pdf 的文件类型来查看您的 pdf 文件。 嗨 oktopus,按照指示,我使用以下代码回显文件类型: if($cEmail=="me@whoever.com") echo " type: ".$_FILES["cFile “][“类型”]; echo " ext: ".$extension; if ($_FILES["cfile"]["type"] == "application/pdf") echo "这是一个 pdf"; else echo "不是 pdf";我得到的输出是: type: application/pdf ext: pdf, not a pdf - 我只是不确定如何更改代码,以免它不可靠地使用 $_FILES["cFile"] [“类型”]。 我不确定我是否正确。但是,如果您使用我提供的代码,我认为不再有type 了?!?您可以在问题中添加您当前使用的代码吗? 检查扩展不会告诉你什么都没有。您应该改为检查 mime 类型。甚至检查 $_FILES 类型会更好 - 但它仍然不可靠 - 准备好 - ***.com/questions/6000229/…

以上是关于上传表单:可以上传纯文本 .txt 文档,但不能上传 .docx 或 PDF...?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet的文件上传

求一个jQuery文本编辑器???要能上传图片 视频 音频的。最好有中文文档。 当然要免费的。

PHP上传表单问题

如何将word文本和图片一起上传

如何保护上传的文档不被 Web 表单直接访问

文件上传下载