Как я могу поток двоичных данных на диск в asp.net с помощью C # - PullRequest
2 голосов
/ 27 сентября 2011

Как передать двоичные данные на диск, где пользователь сначала выбирает путь к местоположению?

Что у меня есть до сих пор: пользователь нажимает в моей RadGrid, и я получаю двоичные данные (или байт [] с помощью.ToArrar ()).

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

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

В основном вы устанавливаете объект ответа на тип oclet, вставляете данные и отправляете их. Браузер клиента определяет, как он будет отображать любые необходимые диалоги для пользователя.

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

string document = "... some server document file name ...";
string fullpath = Server.MapPath("your path"+document);

Response.ContentType = ExtentionToContentType(document);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", document));

byte[] data = System.IO.File.ReadAllBytes(fullpath);
Response.AppendHeader("Content-Length", data.Length.ToString());
Response.BinaryWrite(data);

Response.End();




public string ExtentionToContentType(string file)
{
    switch (System.IO.Path.GetExtension(file).ToLower())
    {
        case ".xls": return "application/vnd.ms-excel";
        case ".doc": case ".docx": return "application/msword";
        case ".ppt": return "application/vnd.ms-powerpoint";
        case ".mdb": return "application/x-msaccess";
        case ".zip": return "application/zip";
        case ".jpg": case ".jpeg":  case ".jpe": return "image/jpeg";
        case ".tiff": return "image/tiff";
        case ".bmp": return "image/bmp";
        case ".png": return "image/png";
        case ".gif": return "image/gif";
        case ".avi": return "video/x-msvideo";
        case ".mpeg": return "video/mpeg";
        case ".rtf": case ".rtx": return "text/richtext";
        case ".txt": return "text/plain";
        case ".pdf": return "application/pdf";
        default: return "application/x-binary";
    }
}
3 голосов
/ 27 сентября 2011

Вы не можете (не можете) передавать данные непосредственно на диск пользователя или взаимодействовать вне браузера пользователя.В веб-приложении все, что вам нужно сделать, это доставить контент пользователю в виде стандартного HTTP-ответа.Об остальном позаботится браузер пользователя.

Есть действительно хороший вопрос / ответ по этому поводу здесь .

Поймите, что протокол HTTP не работает "файлы «.Он имеет дело с запросами и ответами, каждый из которых состоит из заголовков и тела.Итак, что бы ваше веб-приложение делало, создавало ответ, который браузер пользователя мог бы интерпретировать как нечто, что он должен сохранять в виде файла.Заголовки предоставят браузеру то, что нужно для этой интерпретации, а тело предоставит браузеру данные.Обычно он включает в себя следующие шаги:

  1. Удалите все существующие выходные данные (не отправляйте разметку страницы или что-либо подобное).
  2. Установите соответствующие заголовки .В этом случае вы захотите установить такие вещи, как content-length, content-type и, вероятно, content-disposition, чтобы предложить браузеру сохранить ответ в виде файла.
  3. Записать байтыфайла в поток ответов.
  4. Завершение потока ответов.
...