检查AJAX&存在是否存在(下载)文件。 PHP

时间:2016-07-17 14:37:41

标签: javascript php jquery ajax

我有一个下载页面,访问者可以在INPUT字段中输入ZIP文件的名称(不带扩展名)。

index.php:

@Override
public void onBindViewHolder(final TodoViewHolder holder, final int position) {
    final Todo todo = getItem(holder.getAdapterPosition());
    ...
    holder.cbDone.setChecked(todo.isChecked);
    holder.positionTextWatcher.updatePosition(position);
    holder.tvDescription.setText(todo.description);
    ...
}

ZIP文件存储在单独的文件夹" files"中。如果访问者知道文件的名称,一切都很好。如果文件名拼写错误或为空,则脚本会显示错误消息:

download-script.php:

<form action="download-script.php" method="post">
    <input type="text" name="file" placeholder="Enter filename here" />
    <input type="submit" value="Download starten" />
</form>

我的目的是在 <?php $file = preg_replace("/[^0-9a-z.\-_ ]/i", "", $_POST['file']); $file = 'download/' . $file . '.zip'; if (file_exists($file)) { header('Content-Disposition: attachement; filename=' . basename($file)); header('Content-Type: application/force-download'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Content-Length: ' . filesize($file)); header('Connection: close'); readfile($file); } else { echo "File not found"; exit; } ?> 而非 index.php 上显示错误消息,因为 download-script.php < / strong>只会显示错误消息。

2 个答案:

答案 0 :(得分:1)

你可以这样做,让我知道它是否对你有帮助。

<强>的index.php

Task<FirebaseToken> authTask = FirebaseAuth.getInstance().verifyIdToken(idToken)
.addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Object tr) {//do smtg }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception excptn) {//do smtg }
    }).addOnCompleteListener(new OnCompleteListener() {
        @Override
        public void onComplete(Task task) {//do smtg }
    });
    try {
        Tasks.await(authTask);
    } catch(ExecutionException | InterruptedException e ){
        //handle error
    }
    FirebaseToken decodedToken = authTask.getResult();

下载-的script.php

<?php

if (isset($_POST['submit_form'])) {

    $file = preg_replace("/[^0-9a-z.\-_ ]/i", "", $_POST['file']);
    $file_path =  'download/'. $file . '.zip';

    if (file_exists($file_path)) {

        echo "<script>window.location.href='download-script.php?file=".$file."'</script>";
    }
    else { echo "File not found"; exit; }
} 
?>

<form action="" method="post">
    <input type="text" name="file" placeholder="Enter filename here" />
    <input type="submit" name="submit_form" value="Download starten" />
</form>

修改

<?php $file = 'download/'. $_GET['file'] . '.zip'; if (file_exists($file)) { header('Content-Disposition: attachement; filename=' . basename($file)); header('Content-Type: application/force-download'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Content-Length: ' . filesize($file)); header('Connection: close'); readfile($file); } 中添加$file_path变量用于检查文件是否存在,index.php将仅用于存储文件名,该文件名将发送到$file

请立即查看并告知我们:)

编辑#2

我最好为您提供建议,当我们可以在单个文件中完成所有内容时,为什么我们需要另一个文件才能下载。我在单个download-script.php文件中添加了所有代码,因此无需添加javascript重定向,这是我认为导致问题。

请查看以下内容,如果有帮助,请告诉我..

<强>的index.php

index.php

答案 1 :(得分:1)

index.php

<?php
if (isset($_REQUEST["error"])) {
    echo "File not found";
}
?>
<form action="download-script.php" method="post">
<input type="text" name="file" placeholder="Enter filename here" />
<input type="submit" value="Download starten" />
</form>

download-script.php

<?php
$file = preg_replace("/[^0-9a-z.\-_ ]/i", "", $_POST['file']);
$file = 'download/' . $file . '.zip';

if (file_exists($file)) {
    header('Content-Disposition: attachement; filename=' . basename($file));
    header('Content-Type: application/force-download');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Content-Length: ' . filesize($file));
    header('Connection: close');
    readfile($file);
} 
else {
    header('Location: index.php?error=1');
    exit;
}
?>

你可以尝试ajax,但它更复杂,更难调试,请参阅 例如thisthis question