我有一个angularjs表格,我希望用户能够下载他们所要求的PDF格式。我有一个[HTTPGet]方法,它接受json请求的base64编码。一切正常,除非我的base64编码的长度超过2027个字符。发生这种情况时,除了2027个字符外,我什么也收不到。有没有其他方法可以通过get调用发送数据,或者有更好的方法可以做到这一点。
我的angular js应用程序做到了。
scope.DownloadTempResults = function () {
window.open('/Home/GetCopyOfRequest?strRequest=' + window.btoa(JSON.stringify(scope.request)), '_blank', '');
}
我后面的C#代码可以做到这一点。
[HttpGet]
public ActionResult GetCopyOfRequest(string strRequest)
{
byte[] data = Convert.FromBase64String(strRequest);
string request = Encoding.UTF8.GetString(data);
ExternalModel model = JsonHelper.Deserialize<ExternalModel>(request);
byte[] filedata = ObjectFactory.GetInstance<ManagerFactory>().Create().CreateRequestForm(model);
string contentType = "application/pdf";
var cd = new System.Net.Mime.ContentDisposition
{
FileName = "name of File",
Inline = true
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
}
最终,我们要做的是将json编码在查询字符串中,这样您就不能直接查看查询字符串并获取json对象的值。如果我要彻底解决这个问题,请让我知道该怎么做。
此处更新如下。 因此,根据评论,我更改为如下所示的post方法。
[HttpPost]
public HttpResponseMessage GetCopyOfRequest(string strRequest)
{
ExternalModel model = JsonHelper.Deserialize<ExternalModel>(strRequest);
byte[] filedata = ObjectFactory.GetInstance<IManagerFactory>().Create().CreateRequestForm(model);
string fileName = "Request form for request";
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(filedata);
httpResponseMessage.Content.Headers.Add("x-filename", fileName);
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
在angularjs应用中,我有以下代码。
$http({
url: '/Home/GetCopyOfRequest',
method: 'POST',
data: { strRequest: JSON.stringify(request) },
responseType: 'arraybuffer'
}).success(function (data, status, headers) {
var file = new Blob([data], { type: 'application/pdf' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
}).error(function (response) {
});
当我在服务器上执行此操作时,我的字节数组的长度为400000。在客户端,我的数组为270。我遵循How to display a server side generated PDF stream in javascript sent via HttpMessageResponse Content中的示例。