Forms 如何在用户单击时生成下载

Forms 如何在用户单击时生成下载,forms,google-app-engine,http,hyperlink,download,Forms,Google App Engine,Http,Hyperlink,Download,这似乎是noobs的一个问题,但我想知道当用户单击下载按钮时,启动下载所需的确切代码。假设我有这个网页和一个表单,其中包含用户设置的过滤器(即选择日期范围),当用户单击下载按钮时,在其硬盘上创建一个csv文档。我必须与哪个模块通信才能开始下载,文件才具有此扩展名并包含X数据。我听说您必须在HTTP头中设置一些字段,但我不太确定该怎么做 编辑:文件下载现在可以工作了,但是我的文件现在包含了以前在页面上写的所有html以及要下载的数据。这是我的一段代码。为了便于阅读,我删除了很多语句 # Handl

这似乎是noobs的一个问题,但我想知道当用户单击下载按钮时,启动下载所需的确切代码。假设我有这个网页和一个表单,其中包含用户设置的过滤器(即选择日期范围),当用户单击下载按钮时,在其硬盘上创建一个csv文档。我必须与哪个模块通信才能开始下载,文件才具有此扩展名并包含X数据。我听说您必须在HTTP头中设置一些字段,但我不太确定该怎么做

编辑:文件下载现在可以工作了,但是我的文件现在包含了以前在页面上写的所有html以及要下载的数据。这是我的一段代码。为了便于阅读,我删除了很多语句

# 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()