У меня есть форма angularjs, и я хотел бы, чтобы пользователи могли загружать заполненный PDF-файл с тем, что они запрашивали.У меня есть метод [HTTPGet], который принимает кодировку base64 запроса json.Все работает за исключением случаев, когда моя кодировка 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.Если я делаю это совершенно неправильно, пожалуйста, дайте мне знать, что искать, чтобы выполнить это.
Обновлен здесь ниже. Итак, основываясь на комментариях, я перешел на метод публикации, которыйвыглядит следующим образом.
[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. Я следовал примеру из Как отобразить поток PDF, созданный на стороне сервера, в javascript, отправленном через HttpMessageResponse Content .