2016-02-11 21 views
-2

我想使用AJAX下载多种类型的文件。返回base64文件的字符串作为响应使用ASP.NET httpHandler响应AJAX请求

我决定使用AJAX生成带文件名作为查询字符串的get请求,并以base64字符串的形式获取响应,然后将其转换为blob对象并使用超链接a标记以及下载属性进行下载/保存。

请帮助我,如何使用优化的方式/代码将文件转换为base64字符串,然后将base64字符串还原为blob?

+2

的[C#转换文件到Base64String,然后再返回]可能的复制(http://stackoverflow.com/questions/25919387/c-sharp-conversion-file-into-base64string-and-back-again) – CodeCaster

+0

[在内存中创建一个文件供用户下载,而不是通过服务器](http://stackoverflow.com/questions/ 3665115 /创建一个文件在内存中的用户下载不通过服务器) – CodeCaster

+0

我的问题是不是类似于上述两个,所以请不要将其标记为duplicatea TE。 –

回答

0

要将文件转换为Base64字符串使用下面的代码

string data; 
using (FileStream fs = new FileStream(dir + fileName, FileMode.Open, FileAccess.Read)) { 
    byte[] buffer = new byte[fs.Length]; 
    fs.Read(buffer, 0, (int)fs.Length); 
    data = Convert.ToBase64String(buffer); 
    fs.Close(); 
} 
return data; 

在Ajax调用成功函数转换字符串使用下面的代码

var byteCharacters = atob(data); 
var byteNumbers = new Array(byteCharacters.length); 
for (var i = 0; i < byteCharacters.length; i++) { 
    byteNumbers[i] = byteCharacters.charCodeAt(i); 
} 
var byteArray = new Uint8Array(byteNumbers); 
var blob = null; 
blob = new Blob([byteArray], { type: 'text/plain' }); 
blob = new Blob([byteArray], { type: 'application/pdf;base64' }); 
var blobUrl = URL.createObjectURL(blob); 

取决于文件成团块格式,您可以指定blob的类型属性,然后将blobUrl作为源代码分配给您的锚标记

0

ASP.Net httpHandler代码位于:

Imports System 
Imports System.Web 
Imports System.IO 
Public Class FileDownload : Implements IHttpHandler 
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 
    Dim Request As HttpRequest = context.Request 
    Dim Response As HttpResponse = context.Response 
    Dim serverFile As String = Request.QueryString("filename") 
    Dim filePath As String = String.Empty 
    filePath = context.Server.MapPath("~") & "\" & serverFile 
    Dim file As New System.IO.FileInfo(filePath) 
    Try 
     If (file.Exists) Then 
      Response.Clear() 
      Response.ClearContent() 
      Using reader As New FileStream(filePath, FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
       Dim buffer As Byte() = New Byte(reader.Length - 1) {} 
       reader.Read(buffer, 0, CInt(reader.Length)) 
       Response.Write(Convert.ToBase64String(buffer)) 
      End Using 
      Response.Flush() 
      Response.End() 
     Else 
      Response.Write("File Not Found!") 
      Response.StatusCode = 500 
     End If 
    Catch ex As Exception 
     Response.Write(ex.ToString) 
     Response.StatusCode = 500 
     context.ApplicationInstance.CompleteRequest() 
    End Try 
End Sub 
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable 
    Get 
     Return False 
    End Get 
End Property 
End Class 

JavaScript函数调用的URL和客户端文件名httphadler的应用程序路径文件名

function downloadFileByAjax(filename, url) { 
$.ajax({ 
    type: 'GET', 
    url: url, 
    responseType: 'arraybuffer', 
    downloadid: filename, 
    success: function (result, status, xhr) { 
     var octetStreamMime = 'application/octet-stream'; 
     var filename = this.downloadid; 
     var contentType = xhr.getResponseHeader('content-type') || octetStreamMime; 
     var a = document.createElement('a'); 
     var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL; 
     if (urlCreator && window.Blob && ('download' in a) && window.atob) { 
      var blob = base64ToBlob(result, contentType); 
      var url = window.URL.createObjectURL(blob); 
      a.setAttribute('href', url); 
      a.setAttribute("download", filename); 
      var event = document.createEvent('MouseEvents'); 
      event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); 
      a.dispatchEvent(event); 
      //window.URL.revokeObjectURL(url); 
     } 
    }, 
    error: function (xhr, msg, error) { 
     //console.log(xhr, msg, error); 
     //console.log(xhr.responseText); 
     console.log(msg); 
    }, 
    complete: function (xhr, status) { 
     //console.log('completed'); 
    } 
}); 
} 
function base64ToBlob(base64, mimetype, slicesize) { 
if (!window.atob || !window.Uint8Array) { 
    console.log('The current browser doesnot have the atob function. Cannot continue'); 
    return null; 
} 
mimetype = mimetype || ''; 
slicesize = slicesize || 512; 
var bytechars = atob(base64); 
var bytearrays = []; 
for (var offset = 0; offset < bytechars.length; offset += slicesize) { 
    var slice = bytechars.slice(offset, offset + slicesize); 
    var bytenums = new Array(slice.length); 
    for (var i = 0; i < slice.length; i++) { 
     bytenums[i] = slice.charCodeAt(i); 
    } 
    var bytearray = new Uint8Array(bytenums); 
    bytearrays[bytearrays.length] = bytearray; 
} 
return new Blob(bytearrays, { type: mimetype }); 
}