环境:.Net 3.5,jQuery 2.1.4
结果Hello, World在回调中返回,但有没有办法让它作为附件返回?
查询:
function test() {
$.ajax({
type: "POST",
url: "Handler1.ashx",
contentType: "application/json; charset=utf-8",
success: function (data) {
$('#progressBar').hide();
//alert(data);
}
});
Run Code Online (Sandbox Code Playgroud)
通用处理程序:
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//Create and populate a memorystream with the contents of the
//database table
System.IO.MemoryStream mstream = GetData();
//Convert the memorystream to an array of bytes.
byte[] byteArray = mstream.ToArray();
//Clean up the memory stream
mstream.Flush();
mstream.Close();
// Clear all content output from …Run Code Online (Sandbox Code Playgroud) 用户按下form页面上的按钮:
<form id="form">
<input type="button" id="export" value="Export"/>
</form>
Run Code Online (Sandbox Code Playgroud)
单击该按钮后,将进行以下Ajax调用:
ajaxCall('/export', {}, callback_export, 'get');
Run Code Online (Sandbox Code Playgroud)
哪里
function ajaxCall(url, params, callback, type) {
if (validate()) {
var request;
request = $.ajax({
url: url,
type: type,
data: params
});
}
request.done(function (response, textStatus, jqXHR){
callback(response);
});
}
Run Code Online (Sandbox Code Playgroud)
Flask应用程序看起来像这样:
@app.route('/export')
def export():
xl_file= '/absolute/path/to/excel/file.xlsx'
return send_file(xl_file, as_attachment=True, mimetype='application/vnd.ms-excel')
Run Code Online (Sandbox Code Playgroud)
文件的文件内容将返回到浏览器(请参见下图),但不会将文件本身作为附件返回.
问题是,回调需要什么来接受作为文件附件的响应?或者,需要进行哪些修改?
(是的,我搜索并阅读了SE上的许多帖子.大多数讨论使用该form.submit()方法但不提供详细信息.我希望避免使用,form.submit()因为其中的其他元素#form无法提交.)

我已经使用函数填充了一个多维PHP数组,我希望允许我的管理员用户下载内容.
我找到了一个PHP函数,它允许我将数组导出为CSV并将其放在我的functions.php中,使用第二个函数将其挂钩到AJAX并使用jQuery来激活AJAX函数.
有什么问题?
所以我99%肯定AJAX正确发布到PHP函数,但由于某种原因下载没有启动.
我已经研究了很多,但很难找到解决方案 - 真的很欣赏正确方向的一点!
// Function to generate download
function convert_to_csv( $input_array, $output_file_name, $delimiter ) {
/** open raw memory as file, no need for temp files, be careful not to run out of memory thought */
$f = fopen( 'php://memory', 'w' );
/** loop through array */
foreach ( $input_array as $line ) {
/** default php csv handler **/
fputcsv( $f, $line, $delimiter );
}
/** rewrind the "file" with the csv lines **/
fseek( …Run Code Online (Sandbox Code Playgroud) 我一直在使用 React/Typescript 项目处理文件下载链接,并遇到了这个问题。
axios({
method: "post",
url: "http://localhost:8080/test",
data: bodyFormData,
headers: { "Content-Type": "multipart/form-data" },
responseType: 'blob',
})
.then(res => res.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
// the filename you want
a.download = 'test.xml';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
alert('your file has downloaded!')
}).catch(function (e) {
//handle error
console.log(e);
})
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,Typescript 声称出现错误。我还尝试将 res.blob() 更改为 res.data.blob() 然后它不会声明错误,但浏览器控制台说 blob() 不是函数。
我在php中动态生成一个文件,如下所示:
$attachment_url = "http://www.mysite.com/file.jpg";
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.basename( $attachment_url ).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: close');
readfile( $attachment_url );
Run Code Online (Sandbox Code Playgroud)
然后,这些数据通过jQuery.ajax传递
我想在成功时打开文件下载对话框.
现在我有这个:
success: function(data, textStatus, XMLHttpRequest) {
var win = window.open();
win.document.write(data);
}
Run Code Online (Sandbox Code Playgroud)
这会打开一个新窗口并显示原始文件数据.相反,我想要打开一个下载对话框.
我目前有以下工作代码(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错误对象并用它做一些事情.
如果请求成功,我怎么能避免提出两个请求?
"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) 我尝试下载一个pdf文件按钮点击通过ajax调用使用ASP MVC模型当我点击我的按钮,什么都没发生,但当我在网址上添加控制器方法我的文件下载.我只想在按钮点击下载它
JS:
$('#PrintTimeSheet').click(function () {
$.ajax({
type: 'POST',
url: "/Home/DownloadFile",
success: function (response) {
}
});
});
Run Code Online (Sandbox Code Playgroud)
控制器:
public FileResult DownloadFile()
{
Document PDF = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(PDF, memoryStream);
PDF.Open();
PDF.Add(new Paragraph("Something"));
PDF.Close();
byte[] bytes = memoryStream.ToArray();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=Receipt-test.pdf");
Response.BinaryWrite(memoryStream.ToArray());
return File(bytes, "application/pdf");
}
Run Code Online (Sandbox Code Playgroud) 我需要编写一个包含 3 个部分的 api:
我已经完成了第 2 部分和第 3 部分,剩下的就是从 url 获取 pdf 并将其复制/下载到我的 mvc web api。
这是测试的html代码:
< script >
$('#btnSendRequest').on('click', function() {
$.ajax({
type: "POST",
url: "/Convertor/Html",
data: {
strUrl: "http://make-sense.co.il/kb/avcp-script-installation.pdf"
},
success: function(data) {
return true;
},
});
}); < /script>Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<title>tester</title>
</head>
<body>
<h1>tester html</h1>
<div>
<input id="btnSendRequest" type="button" value="SendHttpRequest" />
</div>Run Code Online (Sandbox Code Playgroud)
我的 ActionResult 函数: "convertor/html" ,从网页中获取 url 字符串。我需要的是当我单击按钮时,pdf 文件将自动下载到我的服务器。
public ActionResult …Run Code Online (Sandbox Code Playgroud)