我正在尝试使用 ajax 和 asp.net mvc 5 从 url 下载文件,这是我的控制器:
[HttpPost]
public ActionResult DownloadDocument(DownloadModel model){
urlFile = "http://www.storage.net/data/pdf-xml/" + model.nombre.ToLower() + model.Extencion;
//Create a stream for the file
Stream stream = null;
//This controls how many bytes to read at a time and send to the client
int bytesToRead = 10000;
// Buffer to read bytes in chunk size specified above
byte[] buffers = new Byte[bytesToRead];
// The number of bytes read
try{
//Create a WebRequest to get the file
HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(urlFile);
//Create a response for this request
HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();
if (fileResp.ContentLength > 0)//aquí reviso si el archivo contiene datos (existe o no)
{
if (fileReq.ContentLength > 0)
fileResp.ContentLength = fileReq.ContentLength;
//Get the Stream returned from the response
stream = fileResp.GetResponseStream();
// prepare the response to the client. resp is the client Response
//var resp = HttpContext.Current.Response;
//Indicate the type of data being sent
Response.ContentType = "application/octet-stream";
//Name the file
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + model.nombre + model.Extencion + "\"");
Response.AddHeader("Content-Length", fileResp.ContentLength.ToString());
int length;
do{
// Verify that the client is connected.
if (Response.IsClientConnected){
// Read data into the buffer.
length = stream.Read(buffers, 0, bytesToRead);
// and write it out to the response's output stream
Response.OutputStream.Write(buffers, 0, length);
// Flush the data
Response.Flush();
//Clear the buffer
buffers = new Byte[bytesToRead];
}else{
// cancel the download if client has disconnected
length = -1;
}
} while (length > 0); //Repeat until no data is read
}
}catch (Exception e){
d2.Add("Error", e.Message);
}finally{
if (stream != null){
//Close the input stream
stream.Close();
}else if (d2.Count < 1){
d2.Add("Error", "El Archivo no existe");
}
}
//mostramso el mensaje de que no existe el archivo
return Json(serializer.Serialize(d2));
}
如果表单被定向到控制器,它会执行下载,但如果文件不存在,它会向我发送一条消息,我会在我的视图中显示该消息,但它会显示在单独的视图中。
我希望通过 jquery ajax 完成下载,因为这是我可以显示消息的方式,但下载不会出现在浏览器中
这是我的表单:
<form method="post" class="form-horizontal" role="form" name="formDownload" id="formDownload140464">
<input type="hidden" value="AAA010101AAA" id="rfcCompany" name="rfcCompany">
<input type="hidden" value="40464" id="id" name="id">
<input type="hidden" value=".pdf" id="Extencion" name="Extencion">
<input id="Nombre" name="Nombre">
<button type="button" class="btn btn-primary btn-sm previewPopover" title="Descargar" onclick="MostrarMensaje(40464)">
<span class="elusive icon-download-alt"></span>
</button>
</form>
我的ajax函数就是这个,我用它来显示消息。
function MostrarMensaje(id) {
$('#formDownload1' + id).on("submit", function (e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '/Portal/DownloadDocument',
data: $('#formDownload1' + id).serialize(),
success: function (data) {
var d = JSON.parse(data);
$.jGrowl("" + d["Error"], {
header: "Error",
//sticky: true,
theme: "red"
});
}
});
});
}
这样会显示消息,但不会执行下载。
我已经看到很多人在数据中传递 url 并使用 下载window.location.href = d["Url"];
,但我在此代码中的问题是我不知道该文件是否存在,它会下载一个空文件。
您无法从 JavaScript 打开浏览器下载对话框。您必须导航到文档才能让浏览器打开下载对话框。
如果您想预先检查文件是否存在,您可以做一个检查文件是否存在的操作。通过这种方式,您可以通过 ajax 调用操作以验证文件是否存在,如果存在,则使用 document.location 导航到下载 url。
打开下载对话框的另一种选择是 HTML5 下载属性,它允许您创建一个下载文件的链接,但它不适合您的情况,并且尚未得到所有浏览器的支持。是的,Chrome、Firefox、Edge 和 Opera 支持它,但任何版本的 Internet Explorer 都不支持,如果我没记错的话,Safari 也不支持。
将字节数组作为 json 发送来执行下载是无效的,但您将其作为文件发送
ASP.NET MVC 上传和下载文件
你使用图书馆作为
jquery.file下载
使用 javascript 执行下载