Хорошо, я не знаю вашу платформу, поэтому выложу версию ASP.NET.Если вы используете что-то еще, то я прокомментировал, чтобы вы могли адаптироваться к вашей платформе.
РЕДАКТИРОВАТЬ: Теперь вы знаете, что пользователь использует PHP, поэтому добавил фрагмент кода для PHP (не надежныйно я не PHP разработчик) ...
1) ЖЕ PHP / ASP Получаете ли вы файл, который не будет отображаться в браузере автоматически?т.е. .js будет отображаться как есть, но exe-файл, вероятно, вызовет диалог загрузки файлов (кто-то исправит меня, если я ошибаюсь, и я обновлю)
Если ваши файлы всегда будут, т.е. .exe, тогда вывозможно, просто сойдет с рук:
$("body").append("<iframe src='http://www.targetsite.com/files/thefilename.exe'></iframe>");
, но, скорее всего, вы будете использовать параметр, чтобы найти нужный файл (и скрыть прямую загрузку
$("body").append("<iframe src='http://www.targetsite.com/downloader/?file=1234-1234-1234'></iframe>");
в некоторой функции setTimeout.
Если типы файлов неизвестны, я предлагаю указать приведенный выше код в файле сценария (.ashx, php и т. Д.), Который записывает поток байтов файла в ответ http.
ДЛЯ PHP:
<?php // Demo - send a (binary) file
$file = "ireland.jpg";//here you would use the query string parameter of the above
//ajax/iframe request eg file=1234-1234-1234 to find image in db
$fp = fopen($file,"r") ;
header("Content-Type: image/jpeg");//this would need to be modified to either show right content type or you could
//set it to Application/force-download
while (! feof($fp)) {
$buff = fread($fp,4096);
print $buff;
}
?>
ПРЕДУПРЕЖДЕНИЕ Будьте осторожны с приведенным выше кодом. Мне пришло в голову, что вы можете напрямую указать имя файла, которое, я уверен, кто-то может использовать для получения файлов в других местах вашего приложения.без особого внимания
ДЛЯ ASP:
Я включил пример решения ashx (универсальный обработчик):
aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Wardle.PdfGenerator;
using System.IO;
public partial class user_account_iframedownloader : System.Web.UI.Page
{
private IInformixRepository _rep;
//this page gets loaded into an iframe so we can do downloads while using ajax
protected void Page_Load(object sender, EventArgs e)
{
//write bytes out here i.e. see after for methods
}
}
Пример байтовых методов вывода (you jНужно сделать File.getBytes или что-то еще - мой код довольно сложный, поэтому 'упражнение для читателя'
public static void PdfOutput(byte[] pdfData, string filename)
{
HttpContext.Current.Response.ContentType = "Application/pdf";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename);
HttpContext.Current.Response.BinaryWrite(pdfData);
}
public static void PdfZipOutput(byte[] zipData, string filename)
{
HttpContext.Current.Response.ContentType = "Application/zip";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename);
HttpContext.Current.Response.BinaryWrite(zipData);
}