相关疑难解决方法(0)

通过ajax调用php下载文件

我有一个按钮,onclick它将调用ajax函数.

这是我的ajax功能

function csv(){

    ajaxRequest = ajax();//ajax() is function that has all the XML HTTP Requests

    postdata = "data=" + document.getElementById("id").value;

    ajaxRequest.onreadystatechange = function(){
        var ajaxDisplay = document.getElementById('ajaxDiv');
        if(ajaxRequest.readyState == 4 && ajaxRequest.status==200){
            ajaxDisplay.innerHTML = ajaxRequest.responseText;           
        }
    }

    ajaxRequest.open("POST","csv.php",false);
    ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    ajaxRequest.send(postdata);
}
Run Code Online (Sandbox Code Playgroud)

我根据用户输入创建了csv文件.创建后,我希望它提示下载或强制下载(最好是强制).我在php文件的末尾使用以下脚本来下载文件.如果我在一个单独的文件中运行此脚本,它工作正常.

$fileName = 'file.csv';
$downloadFileName = 'newfile.csv';

if (file_exists($fileName)) {
    header('Content-Description: File Transfer');
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='.$downloadFileName);
    ob_clean();
    flush();
    readfile($fileName);
    exit;
}
echo "done";
Run Code Online (Sandbox Code Playgroud)

但是如果我在csv.php的末尾运行它,它会将file.csv的内容输出到页面(进入ajaxDiv)而不是下载.

有没有办法强制下载csv.php末尾的文件?

javascript php ajax download

32
推荐指数
5
解决办法
12万
查看次数

使用Ajax从Servlet下载文件

我在servlet中创建了一个zip文件.现在我想使用Ajax触发该servlet并向用户提示下载对话框.我可以触发servlet,但我不知道如何获取保存对话框.我怎样才能做到这一点?

ajax servlets download save-as

15
推荐指数
2
解决办法
2万
查看次数

接收一个Zip文件作为对AJAX请求的响应

因此,我在一个需要调用服务器并返回zip文件的网站上工作,事实是我不确定自己是否做对了所有事情。代码看起来像这样:

function download(){
  if($('.download').hasClass('activeBtn')){
    $.ajax({
        type: 'GET',
        url: someUrl,
        contentType: 'application/zip',
        dataType: 'text',
        headers: {
            'Api-Version': '3.4'
        }

    }).then(function (data) {
      console.log(data); //Basically prints the byte array
      //Here I should build the file and download it
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要使用响应中的字节数组来填充文件,我该怎么做?

javascript ajax jquery zip http

4
推荐指数
1
解决办法
2万
查看次数

在Javascript中如何在窗口位置重定向Ajax响应

我目前有以下工作代码(angular但适用于任何JS框架):

var url = '/endpoint/to/my/file';

$http({
  method: 'GET',
  url: url
})
.success(function(jdata) {
  window.location = url;
})
.error(function(je){
  // display errors on page
});
Run Code Online (Sandbox Code Playgroud)

在表单完成并且用户点击"提交"之后调用上面的内容(实际情况比这更复杂,但它是相同的想法).我异步进行表单检查,因此没有页面重新加载.

如果请求成功,则返回二进制文件(pdf文件),如果不成功,请求将返回400 BadRequest,并在JS中格式化错误.所以我做的是,如果成功,我重定向到相同的URL以获得PDF,否则我得到JSON错误对象并用它做一些事情.

如果请求成功,我怎么能避免提出两个请求?

  • 注1:在后端,我想只保留一条完成所有操作的路线,检查+返回PDF
  • 注2:我认为目前的情况非常简洁,因为我有一个异步表单检查,如果成功,文件直接在浏览器中下载,因为我"CONTENT-DISPOSITION" -> "attachment"在成功响应的HTTP头中

更新:有关Emile请求的体系结构的其他信息:在我的用例中,我有一个端点检查输入(和其他外部要求).出于安全原因,如果不满足所有要求,我将无法输出PDF,因此无论如何我必须在交付文件(文件自动生成)之前进行检查.因此,拥有两个端点只会是多余的,并增加一些不必要的复杂性.

在编写时我认为另一种解决方案可能是在执行检查时在端点上传递参数,这样如果成功,它会停止并且不会生成PDF,然后重定向到相同的端点,而不会输出将输出PDF的标志.所以我做了两次检查,但只加载(并生成 - 这是资源密集型)文件只有一次,我只有一个端点......

这是改编的代码:

var url = '/endpoint/to/my/file';

$http({
  method: 'GET',
  url: url+'?check'
})
.success(function(jdata) {
  window.location = url;
})
.error(function(je){
  // display errors on page
});
Run Code Online (Sandbox Code Playgroud)

在后端(我使用Play框架/ Scala)

def myendpoint(onlyDoCheck: Boolean = false) = Action{implicit request =>
   myForm.bindFromRequest.fold(
     e => BadRequest(myErrors),
     v …
Run Code Online (Sandbox Code Playgroud)

javascript

2
推荐指数
1
解决办法
3194
查看次数

标签 统计

ajax ×3

javascript ×3

download ×2

http ×1

jquery ×1

php ×1

save-as ×1

servlets ×1

zip ×1