Forms 如何在用户单击时生成下载
这似乎是noobs的一个问题,但我想知道当用户单击下载按钮时,启动下载所需的确切代码。假设我有这个网页和一个表单,其中包含用户设置的过滤器(即选择日期范围),当用户单击下载按钮时,在其硬盘上创建一个csv文档。我必须与哪个模块通信才能开始下载,文件才具有此扩展名并包含X数据。我听说您必须在HTTP头中设置一些字段,但我不太确定该怎么做 编辑:文件下载现在可以工作了,但是我的文件现在包含了以前在页面上写的所有html以及要下载的数据。这是我的一段代码。为了便于阅读,我删除了很多语句Forms 如何在用户单击时生成下载,forms,google-app-engine,http,hyperlink,download,Forms,Google App Engine,Http,Hyperlink,Download,这似乎是noobs的一个问题,但我想知道当用户单击下载按钮时,启动下载所需的确切代码。假设我有这个网页和一个表单,其中包含用户设置的过滤器(即选择日期范围),当用户单击下载按钮时,在其硬盘上创建一个csv文档。我必须与哪个模块通信才能开始下载,文件才具有此扩展名并包含X数据。我听说您必须在HTTP头中设置一些字段,但我不太确定该怎么做 编辑:文件下载现在可以工作了,但是我的文件现在包含了以前在页面上写的所有html以及要下载的数据。这是我的一段代码。为了便于阅读,我删除了很多语句 # Handl
# Handler class which handles the page /Download
class downloadsHandler(webapp2.RequestHandler):
def get(self):
# write download page on the browser
template = JINJA_ENVIRONMENT.get_template('/pages/download.html')
self.response.write(template.render(template_values))
# data to download
buf = getLatestdata()
# size of data
size = sys.getsizeof(buf)
# set HTTP headers to notify server of download
self.response.headers["Content-Type"] = "text/csv"
self.response.headers["Cache-Control"] = "no-cache, must-revalidate"
self.response.headers["Content-Disposition"] = "attachment; filename=kioskData.csv"
self.response.headers["Content-Length"] = size
self.response.headers["Content-Transfer-Encoding"] = "binary"
# generate download
self.response.write(buf)
如何告诉浏览器只包含要下载的数据?您应该让下载按钮指向一个PHP文件(如果使用PHP),该文件的标题如下所示
<?php
header('Content-type: text/csv');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Content-Disposition: attachment; filename="filename.csv"');
?>
我使用以下命令下载和查看文件(如果支持)。此代码支持重命名用户设备上的文件
<?php
getFile("test.csv");
function getFile($file, $mode="download", $outfile=""){
// File Exists?
if (file_exists($file)){
// Parse Info / Get Extension
$fsize = filesize($file);
$path_parts = pathinfo($file);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
case "jpg": $ctype="image/jpg"; break;
case "csv": $ctype="text/csv"; break;
// video
case "3gp": $ctype='video/3gpp'; break;
case "3g2": $ctype='video/3g2'; break;
case "avi": $ctype='video/avi'; break;
case "mp4": $ctype='video/mp4'; break;
case "ogv": $ctype='video/ogg'; break;
case "asf": $ctype='video/asf'; break;
case "mov": $ctype='video/quicktime'; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
$outfile = ($outfile=="" ? basename($file) : basename($outfile));
if ($mode == "view"){
// View file
header('Content-Disposition: inline; filename='.$outfile);
}
else {
// Download file
header('Content-Disposition: attachment; filename='. $outfile);
}
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
if (ob_get_length() > 0 ) {
ob_clean();
flush();
}
readfile( $file );
}
else {
echo('File Not Found: ' . $file);
}
}
?>
好的。现在一切都好了。我必须清除包含当前页面html数据的输出流
self.response.clear()
在设置标题之前。
这将生成一个仅包含缓冲区内容的csv文件请参见此:和此:谢谢。我正在使用GAE(谷歌应用程序引擎),我正在用Python开发。但是这些是我必须始终设置正确的HTTP头字段?使用“无缓存”禁用对文件的缓存,因此每次生成文件时都会从服务器获取。这是一个愚蠢的问题。这些头值是在客户端发送的GET请求中还是在服务器响应中?我认为代码缺少readfile(“filename.csv”)代码>没有readfile
下载将是空的`右,readfile(“filename.csv”);如果您希望下载现有文件,而如果您正在使用echoHow从PHP输出内容,那么我如何在生成下载时保持用户当前所在的页面不变,则必须使用。我是否必须将用户重定向到另一个页面才能下载,因为此页面的http头将不同?实际上,该页面不会更改。发送头之后,php处理停止。提交表单后,您可以在(或任何php)上重新加载页面,但在回显任何内容之前,以及在验证需要验证的内容(例如,$\u POST
参数)之后,请下载该文件。用户将保留原始加载页面。您可以阅读更多。它也应该回答你在另一个答案中发布的问题。你是否包含了具有if(ob_get_length()>0){ob_clean();flush();}
这应该清除缓冲区并删除HTML的代码。从流程的角度来看,您应该检查$\u POST
或$\u GET
数据,并在处理和输出html页面之前启动下载。
self.response.clear()