2017-01-27 13 views
0

Я хочу загрузить файлы в браузере с помощью ajax и ActionResult. Файл загружается и возвращается из моего ActionResult.Скачать файл с ajax и ActionResult

Я вижу, что запрос Http в порядке и увидеть данные в теле ответа. Проблема в том, что файл не предлагается сохранять в браузере.

Все кажется хорошим. Все, что я видел в учебнике и форуме, было похоже на то, что я сделал, но у меня нет слова XD. Я не понимаю, в чем разница между моими и остальными.

Вот мой ActionResult:

public ActionResult ShippingDownloadDNPriority(string SALE_GUID) 
{ 
    int supId = -1; 
    int.TryParse(Session["SupId"].ToString(), out supId); 
    if (supId < 0) 
     return null; 

    WebResponse response = CallApi.DownloadAndCreateDN(Session["UserLogin"].ToString(), Session["IdentConnect"].ToString(), SALE_GUID, supId, true); 
    Stream responseStream = response.GetResponseStream(); 

    var cd = new System.Net.Mime.ContentDisposition 
    { 
     FileName = "myfile.pdf", 
     Inline = false, 
    }; 
    Response.Headers.Add("Content-Disposition", cd.ToString()); 
    Response.ContentType = "application/octet-stream"; 
    return File(responseStream, System.Net.Mime.MediaTypeNames.Application.Pdf, "myfile.pdf"); 
} 

public static WebResponse DownloadAndCreateDN(string login, string session, string SALE_GUID, int supid, bool priority) 
{ 
    string[] res = new string[2]; 

    StringBuilder postData = new StringBuilder(); 
    postData.AppendLine("{"); 
    postData.AppendLine(string.Format("\"login\":\"{0}\",", login)); 
    postData.AppendLine(string.Format("\"session\":\"{0}\",", session)); 
    postData.AppendLine(string.Format("\"saleguid\":\"{0}\",", SALE_GUID)); 
    postData.AppendLine(string.Format("\"supid\":{0},", supid)); 
    postData.AppendLine(string.Format("\"prority\":{0}", priority.ToString().ToLower())); 
    postData.AppendLine("}"); 

    ASCIIEncoding ascii = new ASCIIEncoding(); 
    byte[] postBytes = ascii.GetBytes(postData.ToString()); 

    string url = Properties.Settings.Default.ISAPIAddress + "deliverynote/create"; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "POST"; 
    request.ContentType = "application/json"; 
    request.ContentLength = postBytes.Length; 

    Stream postStream = request.GetRequestStream(); 
    postStream.Write(postBytes, 0, postBytes.Length); 
    postStream.Flush(); 
    postStream.Close(); 

    return request.GetResponse(); 
} 

Вот мой JavaScript:

$.ajax({ 
    url: '../Shipping/ShippingDownloadDNPriority?SALE_GUID=XXXXXXXXXXXXXX', 
    data: { SALE_GUID: DropShipping.GetRowKey(rowIndexSale) }, 
    async: false, 
    //success: function (data) { window.downloadFile = data; } 
}); 

Спасибо всем

ответ

0

Я изменил идею. Я просто отправлю свой pdf-файл (с моего контроллера) на 64-й базе и сделаю в ajax:

success: function (data) { 
    window.open("data:application/pdf;base64," + data.data, '_blank'); 
} 
2

AJAX является лишь тонким клиентом. Ничего не происходит с ответом, возвращаемым по умолчанию. Вы несете ответственность за выполнение загрузки. Однако для этого требуется API файлов, который является частью HTML5. В результате это возможно только в современных браузерах (IE10 +).

Внутри вашего метода успеха AJAX:

var blob = new Blob(data, { type: 'application/pdf' }); 
var a = document.createElement('a'); 
var url = window.URL.createObjectURL(blob); 
a.href = url; 
a.download = 'myfile.pdf'; 
a.click(); 
window.URL.revokeObjectURL(url); 

EDIT

JQuery не интерпретирует ответ типа правильно по умолчанию. Вам нужно немного изменить свой $ .ajax вызов:

$.ajax({ 
    url: '../Shipping/ShippingDownloadDNPriority?SALE_GUID=XXXXXXXXXXXXXX', 
    data: { SALE_GUID: DropShipping.GetRowKey(rowIndexSale) }, 
    async: false, 
    // -- ADD THIS -- 
    xhrFields: { 
     responseType: 'blob' 
    }, 
    success: function (data) { 
     // code above here, but no longer need to create blob 
     var a = document.createElement('a'); 
     var url = window.URL.createObjectURL(data); 
     a.href = url; 
     a.download = 'myfile.pdf'; 
     a.click(); 
     window.URL.revokeObjectURL(url); 
    } 
}); 

check out a CodePen here Вы можете увидеть его работу.

+0

Спасибо, я проверил это завтра. – Gobelet

+0

Это не работает, у меня есть эта ошибка: «Не удалось построить« Blob »: первый аргумент не является ни массивом, ни индексированными свойствами» – Gobelet

+0

См. Вышеизложенное. –