|  17.06.2010, 02:16 | #1 | 
| Участник |  Enterprise Portal - как скачать файл? 
			
			Поясняю контекст. На странице портала пользователь нажимает кнопку. Неспроста, а чтобы некий отчет сформировался, сохранился в pdf-формате на сервере (EPDocuGetWebLet для этой задачи не подходил, обошлись парой дюжин строк кода), ну и теперь надо этот pdf-отчет вернуть пользователю. Как это сделать проще всего? Все, что имеется - это имя файла. Обязательно ли использовать weblet или можно просто написать несколько строк кода в методе dataset'а, ну или во вспомогательном классе? Или описанный подход в принципе неверен? И, чтобы два раза не вставать, еще такой вопрос: У web menu item'а EPSalesInvoice следующий линк: _layouts/ep/downloaddocument.aspx Но если нпаротив линка нажать "Browse for page", Аксапта ругается, что этот фолдер no longer available. Не могу понять где именно на портале искать этот downloaddocument.aspx. Не подскажете? | 
|  | 
|  17.06.2010, 07:35 | #2 | 
| Участник | 
			
			Тут описан такой пример: Код: protected void Button1_Click(object sender, EventArgs e)
    {
        AxUrlMenuItem menuItem = new AxUrlMenuItem("EPDocuGet");
        DataSetViewRow row = dsEPCustInvoiceJournalInfo.GetDataSet().DataSetViews[0].GetCurrent();
        AxTableContext context = AxTableContext.Create(row.GetDefaultTableDataKey(row.DataSetView.Metadata.RootDataSource));
        menuItem.MenuItemContext = context;
   
        //Response.Redirect(menuItem.Url.ToString());
 
        string downloadURL = "window.open('" + menuItem.Url.ToString() + "', '_blank', '' );";
        ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", downloadURL, true);
 
    } | 
|  | 
|  17.06.2010, 09:16 | #3 | 
| Участник | 
			
			Или можно просто сделать переадресацию на файл: Код: Response.Redirect("путь_к_файлу"); | 
|  | 
|  17.06.2010, 15:17 | #4 | 
| Участник | Цитата: Что-то я не понимаю, как этим способом можно воспользоваться. Редирект ведь надо делать на URL, например response.redirect("http://www.google.com"). Редирект на "C:\Windows\Temp\tmp7B92.tmp" браузер не поймет. Редирект на "file:///Windows/Temp/tmp7B92.tmp" будет искать файл на компьютере клиента, а не на сервере. | 
|  | 
|  17.06.2010, 15:59 | #5 | 
| Участник | 
			
			из примера выше, взятого с блога по ссылке: Код: AxUrlMenuItem menuItem = new AxUrlMenuItem("EPDocuGet");
        DataSetViewRow row = dsEPCustInvoiceJournalInfo.GetDataSet().DataSetViews[0].GetCurrent();
        AxTableContext context = AxTableContext.Create(row.GetDefaultTableDataKey(row.DataSetView.Metadata.RootDataSource));
        menuItem.MenuItemContext = context;
   
        Response.Redirect(menuItem.Url.ToString()); | 
|  | 
|  17.06.2010, 16:48 | #6 | 
| Участник | Разбираюсь с этим примером 
			
			Кстати, URL menu item EPDocuGet из примера как раз и ссылается на "_layouts/ep/downloaddocument.aspx" - местоположение, на которое AX ругается (см. первоначальный пост). Если я захочу создать веблет в том же месте, непонятно как это сделать. Смотрим на код downloaddocument.aspx: он ссылается на веблет EPDocuGetWebLet, который для моей задачи не подходит. EPDocuGetWebLet принимает как параметр конкретную запись таблицы, генерирует по ней отчет и возвращает pdf. У меня же pdf уже есть, мне надо только вернуть его пользователю. Получается, что надо или допиливать EPDocuGetWebLet или создавать собственный веблет. Других вариантов нет, без веблетов никак? | 
|  | 
|  17.06.2010, 19:23 | #7 | 
| Участник | 
			
			Допилил немного EPDocuGetWebLet. Передаю ему имя файла из X++: X++: menuFunction = new WebUrlMenuFunction(weburlitemstr(EPDocuGet)); weblink = new WebLink(); webLink.menufunction(menuFunction); weblink.addOrUpdateExtraParam("filename", filename); webSession().redirect(webLink); В веблете его использую: X++: webSession.getParm("filename")Файл отдается пользователю. Но это никуда не годится, потому что в веблет параметры передаются в открытом виде: httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=C:\Windows\TEMP\tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973 Есть какой-нибудь стандартный способ зашифровки передающегося параметра перед подобным редиректом ? Что порекомендуете? | 
|  | 
|  17.06.2010, 22:31 | #8 | 
| Member | 
			
			Может просто ограничить права доступа для учетной записи, под которой работает бизнес-коннектор?
		 
				__________________ С уважением, glibs® | 
|  | 
|  17.06.2010, 23:06 | #9 | 
| MCTS | |
|  | 
|  18.06.2010, 00:25 | #10 | 
| Участник | Цитата: Это не спасет: зная путь и имя файла, любой пользователь сможет его скачать. Нужно, чтобы пользователь и не подозревал, где именно на сервере лежит файл. В настройках сайта шифрование, разумеется, включено. Кажется, нашел метод шифрования конкретного параметра. Хак, конечно, но все же: добавляем в метод \Classes\WebSession\paramRequiresEncryption строчку X++: case 'WFNM': httр://vmax2009chmdev1:8080/sites/ax/_layouts/ep/downloaddocument.aspx?WFNM=8c1586207c7ab4f43e22154a96a38db51539556da84d3e740b3f9eae9bab756b00ae4ec95616acb6302bcd1fb1ff0c04c9bc7754ae5302f806488e97a1a00d372a1a13fc017c649294656e8016d1db95cb7749f3df4516bd&WCMP=cee&WCIV=634124027024790310 | 
|  | 
|  18.06.2010, 02:22 | #11 | 
| Участник | Цитата: 
		
			Сообщение от LEXAR
			   Тут описан такой пример Кстати, попробовал я этот код: X++: string pdfUrl = (string)this.dsMyDataSet.GetDataSet().DataSetRun.AxaptaObjectAdapter.Call("getPdfUrl"); pdfUrl = "window.open('" + pdfUrl + "', '_blank', '' );"; ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", pdfUrl, true); Символы амперсанда при открытии нового окна трансформируются в & Соответственно, ничего не открывается. http://vmax2009chmdev1:8080/sites/ax/_layouts/ep/downloaddocument.aspx?WFNM=28bb82fdfd1a3fблаблаблаbe5dbce3b7cca792&WCMP=cee&WCIV=634124096668411683 В общем, задача с горем пополам решена. Осталось отшлифовать отдельные моменты. | 
|  | 
|  05.11.2014, 08:43 | #12 | 
| Участник | Цитата: 
		
			Сообщение от Hyper
			   Допилил немного EPDocuGetWebLet. Передаю ему имя файла из X++: X++: menuFunction = new WebUrlMenuFunction(weburlitemstr(EPDocuGet)); weblink = new WebLink(); webLink.menufunction(menuFunction); weblink.addOrUpdateExtraParam("filename", filename); webSession().redirect(webLink); X++: webSession.getParm("filename")httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=C:\Windows\TEMP\tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973 Есть какой-нибудь стандартный способ зашифровки передающегося параметра перед подобным редиректом ? Что порекомендуете? Подниму тему. Может вспомните, были ли какие то проблемы при модификации вэблета? Сделал так же как вы, но либо изменения в классе не "видятся" либо параметр не передается, в общем открывается пустая страница, файл не отдается. | 
|  | 
|  06.11.2014, 10:55 | #13 | 
| Участник | 
			
			Мы делаем так C:\Windows\TEMP - или любую другую папку зашили в параметры портала в Ах Строку для скачивания переделываем в httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973 (расширение можно убрать) Дальше в EPDocuGet.run смотрим параметр filename: webSession.getParm("filename") != '' Собираем путь к файлу C:\Windows\TEMP\ + webSession.getParm("filename") и передаем в метод, EPDocuGet::runDocument который надо переписать под свои нужды. Этот способ уже обсуждался на форуме, только не смог быстро найти тему   | 
|  | 
| Теги | 
| enterprise portal | 
|  | 
| 
 |