我有一个下载页面,访问者可以在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>只会显示错误消息。
答案 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,但它更复杂,更难调试,请参阅 例如this或this question。