Скачать файл с веб-сервиса - на сайте ASP.NET - PullRequest
10 голосов
/ 10 февраля 2010

Я хочу отправить файл в браузер с веб-сайта, используя веб-сервис. В настоящее время я читаю файл в байтовый массив base64 и возвращаю его из веб-службы. Этот веб-сервис вызывается с веб-сайта, и я застрял на том, как отправить его как исходный файл в браузер. В идеале я хотел бы прочитать массив байтов в поток памяти, а затем просто записать его в поток ответа, если это возможно, чтобы конечный пользователь просто загрузил файл.

Ответы [ 4 ]

13 голосов
/ 10 февраля 2010

Во-первых, вместо отправки байтового массива base64 ваш веб-сервис просто возвращает байтовый массив для вашего файла. Response.OutputStream.Write() автоматически закодирует ваши байты base64, поэтому вы можете также не закодировать их в потоке памяти.

Во-вторых, вам нужно больше, чем просто байты. Вам понадобятся метаданные, связанные с файлом. Для приведенного ниже фрагмента я поместил все эти метаданные в отдельный класс (локальный экземпляр с именем «file»). Затем просто используйте этот фрагмент, как только у вас есть необходимые данные:

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();
3 голосов
/ 10 февраля 2010

Возможно, вам нужно будет явно указать ContentType для HttpResponse, например:

Response.ContentType = "image/jpeg";
Response.OutputStream.Write(buffer, 0, buffer.Length);

Если вы хотите контролировать имя файла, вам нужно добавить заголовок Content-Disposition. Google может помочь вам найти правильный способ разобраться в этом.

1 голос
/ 10 февраля 2010

Обычно вставлять файл в веб-сервис - плохая идея. Вы просто добавляете накладные расходы и усложняетесь без реальной выгоды.

Вместо этого вы должны предоставить IHttpHandler для обработки загрузки файла. Большинство веб-серверов также предоставляют вспомогательные API для упрощения этого, например, в ASP.NET вы можете получить доступ к загруженному файлу с помощью:

HttpContext.Request.Files [0]

Существует множество сценариев загрузки файлов javascript, которые упрощают это на клиенте: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

0 голосов
/ 10 февраля 2010

Это действительно зависит от интерфейса вашего веб-сервиса. Т.е. SOAP, REST, ASPX.

Одна вещь, которую вы можете попробовать, это изменить тип содержимого в вашем Ответе на «Приложение / Октет-поток». Или что-то подобное, чтобы сообщить получателю тип MIME.

Если вы используете WCF, вы можете использовать Stream в качестве типа возврата в веб-сервисе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...