kav@94 Ответов: 2

Как сохранить файл excel в папке загрузки с помощью ASP .NET C#


Below is my code to download the data in excel but the problem is while downloading it is not showing that the file is getting downloaded moreover i am giving the path in this way as given below to download the file in downloads folder but i should not use this because it works in local host but it will not work when hosted in server.how can i download into downloads folder with showing the downloading file at bottom


string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
           string pathDownload = Path.Combine(pathUser, "Downloads\\");

protected void btnExportExcel_Click(object sender, EventArgs e)
    {
string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
               string pathDownload = Path.Combine(pathUser, "Downloads\\");
 DataTable dtExcel = (DataTable)ViewState["data"];
ExportToExcel(dsExcel, pathDownload + "\\" + file.xls");
}
 private void ExportToExcel(DataSet table, string filePath)
    {

        int tablecount = table.Tables.Count;
        StreamWriter sw = new StreamWriter(filePath, false);
        sw.Write(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">");
        sw.Write("<font style='font-size:10.0pt; font-family:Calibri;'>");

        for (int k = 0; k < tablecount; k++)
        {


            sw.Write("<BR><BR><BR>");
            sw.Write("<Table border='1' bgColor='#ffffff' borderColor='#000000' cellSpacing='0' cellPadding='0' style='font-size:10.0pt; font-family:Calibri; background:'#1E90FF'> <TR>");


            int columnscount = table.Tables[k].Columns.Count;

            for (int j = 0; j < columnscount; j++)
            {
                sw.Write("<Td bgColor='#87CEFA'>");
                sw.Write("");
                //sw.Write(table.Columns[j].ToString());
                sw.Write(table.Tables[k].Columns[j].ToString());

                sw.Write("");
                sw.Write("</Td>");
            }
            sw.Write("</TR>");
            foreach (DataRow row in table.Tables[k].Rows)
            {
                sw.Write("<TR>");
                for (int i = 0; i < table.Tables[k].Columns.Count; i++)
                {
                    sw.Write("<Td>");
                    sw.Write(row[i].ToString());
                    sw.Write("</Td>");
                }
                sw.Write("</TR>");
            }
  sw.Write("</Table>");
            //sw.Write("<BR><BR><BR><BR>");
            //sw.Write("\n");
            //sw.Write(string.Format("Line1{0}Line2{0}", Environment.NewLine));


            sw.Write("</font>");

        }
        sw.Close();
    }


the below two lines that i am using in btnexportexcel should not be used


string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
               string pathDownload = Path.Combine(pathUser, "Downloads\\");


Что я уже пробовал:

he problem is while downloading it is not showing that the file is getting downloaded moreover i am giving the path in this way as given below to download the file in downloads folder but i should not use this because it works in local host but it will not work when hosted in server

Maciej Los

Поперечный столб: https://stackoverflow.com/questions/44584182/how-can-i-save-excel-file-in-downloads-folder-using-asp-net-c-sharp

2 Ответов

Рейтинг:
1

F-ES Sitecore

Вы не загружаете файл на клиент, вы просто записываете его в файловую систему машины, на которой выполняется код. Когда это была ваша локальная машина, казалось, что она работает, но теперь код развернут на сервере, и он записывает файл на сервер.

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

Google "asp.net скачать файл на клиент" для примеров того, как это сделать.


kav@94

я пробовал но они не работают во время загрузки я получаю исключение

F-ES Sitecore

Если код, который вы используете, неверен, обновите исходный вопрос с помощью кода, который вы пытаетесь использовать, что такое исключение и в какой строке оно появляется.

kav@94

Ответ.ContentType = " APPLICATION/OCTET-STREAM";
Заголовок Строки = " Вложение; Filename=XMLFile.xml";
Ответ.AppendHeader ("Content-Disposition", Заголовок);
Системы.ИО.FileInfo может единственный способ иметь установленный = новая система.ИО.FileInfo Может(Сервер.MapPath ("здесь у меня было имя папки приложения gien"));
Ответ.Функция WriteFile(Единственный Способ Иметь Установленный.Полное имя);
//Не забудьте добавить следующую строку
Ответ.Конец();

это код, который я использовал, но он дает исключение, потому что я использую stream writer в своем коде, и этот код не работает, я должен быть в состоянии перейти в папку загрузок при нажатии кнопки

F-ES Sitecore

Что такое исключение и на какой линии?

Рейтинг:
0

OriginalGriff

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

Вместо этого вы либо даете пользователю ссылку на клик:

<a href="serverFilePath.xlsx" >Click to Save Excel document</a>

Или вы отправляете его через объект ответа:
byte[] fileContent = File.ReadAllBytes(path);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.AddHeader("Content-Disposition attachment; filename=myFile.xlsx");
    HttpContext.Current.Response.AddHeader("Content-Length", fileContent.Length.ToString());
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.BinaryWrite(fileContent);
    HttpContext.Current.Response.End();


OriginalGriff

Цитирую себя: "вы не можете контролировать то, что происходит с ним после начала загрузки, поскольку это полностью зависит от пользователя и его настроек браузера"
Вы не можете контролировать папку, в которую он попадает, или даже то, что он вообще сохраняется.

kav@94

byte[] fileContent = файл.ReadAllBytes(путь);
Свойство HttpContext.Тока.Ответ.Четкий();
Свойство HttpContext.Тока.Ответ.AddHeader ("Content-Disposition attachment; filename=myFile.xlsx");
Свойство HttpContext.Тока.Ответ.AddHeader ("Content-Length", fileContent.Длина.Метод toString());
Свойство HttpContext.Тока.Ответ.ContentType = " application/octet-stream";
Свойство HttpContext.Тока.Ответ.BinaryWrite(fileContent);
Свойство HttpContext.Тока.Ответ.Конец();

размещая этот код я получаю ошибку рядом с path и рядом с заголовком add

OriginalGriff

Вы когда-нибудь задумывались о чтении примера кода с точки зрения того, что автор не может точно видеть, что вам нужно ввести, и, возможно, придется использовать заполнители.
Вы знаете, например, "путь", где вам нужно поместить фактический путь к файлу, к которому вам нужно получить доступ, например? А "MyFile", где он не знает имени файла, в котором вы хотите его сохранить? :вздыхать:

kav@94

я знаю, что должен указать путь для загрузки excel, но я не могу пройти этот путь, потому что при размещении на сервере он выдает ошибку, поэтому я получил удар

строка pathUser = Environment.GetFolderPath(Environment.Специальная папка.Профиль пользователя);
строка pathDownload = путь.Combine(pathUser, " загрузки\\");

OriginalGriff

Профиль пользователя бесполезен на веб-сайте, каким пользователем вы себя считаете? IIS не использует идентификатор пользователя, который может быть вам полезен, и не имеет "обычной" папки в разделе "Пользователи".

Папка, которая вам нужна, почти наверняка будет частью структуры вашего сайта, а это значит, что вам, вероятно, понадобится что-то вроде сервера.MapPath (@"~\Downloads\TheFileIWantToAccess");

kav@94

охраняемых недействительными btnExportExcel_Click(объект отправителя, EventArgs в электронной)
{
строка pathDownload = @ "~\Downloads\ " +Session ["CPT"].ToString () + " - " + "HistoricalData.xls";
ExportToExcel(dsExcel, pathDownload);
lblMessage.Text = " Успешно Загружено";
}
private void ExportToExcel(таблица набора данных, строковый путь к файлу)
{

int tablecount = таблица.Таблицы.Рассчитывать;
StreamWriter sw = new StreamWriter(filePath, false);
}
это путь, который я получаю ~\Downloads\DATA.xls

и я получаю это исключение не смог найти часть пути 'C:\Program файлы (x86)\Общие файлы\Microsoft Shared\DevServer\11.0\~\Downloads\DATA.xls". рядом модулю записи StreamWriter ео = новая модулю записи StreamWriter(путь_к_файлу, ложные);

OriginalGriff

:вздыхать:

Сервер.MapPath ... Еще раз процитирую себя:

- Папка, которая вам нужна, почти наверняка будет частью структуры вашего сайта, а это значит, что вам, вероятно, понадобится что-то вроде сервера.MapPath (@"~\Downloads\TheFileIWantToAccess");'

kav@94

я не сохраняю свой файл в папке приложения я должен непосредственно сохранить его в папке Загрузки

OriginalGriff

И где находится папка загрузок на вашем веб-сайте в производстве?

kav@94

каждый пользователь будет иметь папку Загрузки знать где все файлы загружаются в загрузках то есть где мне нужно разместить свой файл

OriginalGriff

Теперь на одном компьютере размещено много разных сайтов?
Каждый веб-сайт имеет отдельную "файловую область", где хранятся все его файловые данные, HTML, ASPX, двоичные файлы C#, пользовательские данные и многое другое. Большинство систем организуют это в иерархическую структуру, так что у вас есть корневая папка веб-сайта (с файлом по умолчанию.aspx и тому подобным), а вся остальная информация находится в папках, которые висят на ней. Эта корневая папка веб-сайта называется " ~ " и используется вместе с сервером.MapPath для преобразования относительного адреса (т. е. относительно корня веб-сайта) в физический адрес, такой как "C:\IIS\Websites\YourDomainName\Users\DownLoads\JoeSmith117" from " ~\Users\DownLoads\JoeSmith117"
Вы не получаете доступ к жесткому диску напрямую, кроме как с помощью сервера.MapPath, потому что вы понятия не имеете, где находится ваш сайт и когда он может быть перемещен.