Я хочу нажать файл в браузере с веб-сайта с помощью веб-службы. Я сейчас читаю файл в массив байтов base64 и возвращаю его из webservice. Этот веб-сервис вызывается с веб-сайта, и я зациклился на том, как это сделать в качестве исходного файла в браузере. В идеале я хотел бы прочитать массив байтов в поток памяти, а затем просто записать его в поток Response, если это возможно, поэтому конечный пользователь просто загружает файл.
Загрузить файл с webservice - на сайте ASP.NET
Ответ 1
Во-первых, вместо отправки массива байтов base64, ваша веб-служба просто возвращает массив байтов для вашего файла. Response.OutputStream.Write()
будет автоматически base64 кодировать ваши байты, поэтому вы также можете их не кодировать в вашем потоке памяти.
Во-вторых, вам нужно больше, чем просто байтов. Вам понадобятся метаданные, связанные с файлом. Для нижеприведенного фрагмента я поместил все эти метаданные в отдельный класс (локальный экземпляр с именем "файл" ). Затем просто используйте этот фрагмент, как только у вас есть необходимые данные:
Response.Clear();
Response.ClearHeaders();
Response.ContentType = file.ContentType;
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
Response.AddHeader("Content-Length", file.FileSize.ToString());
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
Response.Flush();
Response.End();
Ответ 2
Возможно, вам нужно убедиться, что вы явно задали ContentType HttpResponse, например:
Response.ContentType = "image/jpeg";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Если вы хотите управлять именем файла, вам нужно будет добавить заголовок Content-Disposition. Google может помочь вам найти правильный способ сортировки.
Ответ 3
Обычно это плохая идея встроить файл в веб-службу. Вы просто добавляете накладные расходы и сложность без реальной выгоды.
Вместо этого вы должны предоставить IHttpHandler для обработки загрузки файла. Большинство веб-серверов также предоставляют вспомогательный API, чтобы упростить это, например. в ASP.NET вы можете получить доступ к загруженному файлу с помощью:
HttpContext.Request.Files [0]
Существует множество сценариев загрузки файлов javascript, которые упрощают это на клиенте: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/
Ответ 4
Это действительно зависит от интерфейса вашего веб-сервиса. Т.е. SOAP, REST, ASPX.
Одна вещь, которую вы можете попробовать, - изменить тип содержимого в ответе "Приложение/октет-поток". Или что-то подобное, чтобы сообщить получателю тип MIME.
Если вы используете WCF rest, вы можете использовать Stream как тип возврата в веб-службе.