none
Создание ярлыка на клиентской стороне RRS feed

  • Вопрос

  • Есть SharePoint2013.

    На ribbon поместил кнопку.

    При нажатии,  с помощью $.ajax, отправляю на web service url того места, где находится пользователь.

    $.ajax({
                type: 'POST',
                url: 'http://site.ru/_layouts/15/ServiceLinkToLib/ServiceLinkToLib.asmx/CreateShortcut',
                data: '{URL: ' + JSON.stringify(decodeURI(window.location.href)) + '}',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                async: true,
                cache: false,
                success: function () {}
            });  


    В сервисе я обрабатываю url, получаю нужный мне вид.

    имя ярлыка title: title_shortcut

    путь для ярлыка path (такой вид будет открывать файлы в проводнике): \\site.ru\folder\folder

    Теперь создаю ярлык

    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    
                using (StreamWriter writer = new StreamWriter(deskDir + "\\" + title + ".url"))
                {
                    writer.WriteLine("[InternetShortcut]");
                    writer.WriteLine("URL=" + path);
                    writer.Flush();
                }

    Проблема в том, что так ярлык будет создаваться на сервере.

    Мне нужно, чтоб ярлык создался у пользователя на раб.столе. 

    Как мне быть?



    • Изменено ilya83 3 декабря 2014 г. 13:11
    3 декабря 2014 г. 13:05

Ответы

  • Вот что должно у Вас быть в событии PageLoad:

    	    MemoryStream MemoryStream = new MemoryStream();
                TextWriter TextWriter = new StreamWriter(MemoryStream);
                TextWriter.WriteLine("[InternetShortcut]");
                TextWriter.WriteLine("URL=http://www.ulmaskulov.ru");
                TextWriter.Flush();
                byte[] bytes = MemoryStream.ToArray();
                MemoryStream.Close();
    
                Response.Clear();
                Response.ContentType = "application/force-download";
                Response.AddHeader("content-disposition", "attachment;    filename=short.url");
                Response.BinaryWrite(bytes);
                Response.End();  

    Только Вам надо разный контент генерить, точнее ссылку в ярлыке.
    Используя JavaScript, передавайте параметры и считывайте их через QueryString.

    • Помечено в качестве ответа ilya83 4 декабря 2014 г. 12:46
    4 декабря 2014 г. 12:12
  • application/force-download просит браузер сразу качать файл, даже если он может его просмотреть.

    Точнее выдать диалог на скачку.

    • Изменено Alexander Ulmaskulov 4 декабря 2014 г. 12:52
    • Помечено в качестве ответа ilya83 4 декабря 2014 г. 12:58
    4 декабря 2014 г. 12:52

Все ответы

  • Здравствуйте!

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

    3 декабря 2014 г. 13:27
  • Я так понимаю, если я отправил запрос на сервер через ajax, то сам мой сервис

       [System.Web.Script.Services.ScriptService]
        class ServiceLinkToLib:WebService
        {    
            [WebMethod]
            [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
            public void CreateShortcut(string URL)
            {
    
            }
        }
    должен возвращать какой-то тип данных. Мне надо void на что-то поменять. Не очень понимаю.

    3 декабря 2014 г. 13:41
  • Полагаю, что создавать ярлык вы должны на стороне клиента, а не сервера.

    Т.е. шаги такие:

    1. Создать запрос к серверу

    2. Получить от сервера параметры ярлыка

    3. Создать ярлык


    Сазонов Илья http://isazonov.wordpress.com/

    3 декабря 2014 г. 14:36
    Модератор
  • Создать ярлык на рабочем столе используя JavaScript нельзя, к сожалению.

    • Предложено в качестве ответа Maxim Shusharin 4 декабря 2014 г. 0:37
    3 декабря 2014 г. 15:03
  • Можно перенаправить пользователя на страницу, которая создаст ярлык и предложит его скачать.

    Можно использовать activeX и пр., но это будет достаточно трудоемко.

    3 декабря 2014 г. 15:04
  • Можно перенаправить пользователя на страницу, которая создаст ярлык и предложит его скачать.

    Можно использовать activeX и пр., но это будет достаточно трудоемко.

    Т.е. мне сервис не надо использовать?

    Есть у Вас подобный пример как это сделать?


    4 декабря 2014 г. 6:12
  • Можно перенаправить пользователя на страницу, которая создаст ярлык и предложит его скачать.

    Можно использовать activeX и пр., но это будет достаточно трудоемко.

    Т.е. мне сервис не надо использовать?

    Есть у Вас подобный пример как это сделать?


    У вас проблема не как получить URL, а как создать сам ярлык. Url получить можно, а вот что с ним делать дальше? Ну отдаст его сервис клиентской стороне и что мы с ним делать будем?
    4 декабря 2014 г. 7:01
  • На данный момент я отказался от WebService.

    При нажатии на кнопку, перенаправляю пользователя на другую страницу.

    Здесь в методе Page_Load мне надо как-то отправить на сохранение сам ярлык через Response.Flush.

    Я так думаю. 

    4 декабря 2014 г. 7:19
  • В Page_Load написал

    this.Page.Response.Clear();
    this.Page.Response.ContentType = System.Net.Mime.MediaTypeNames.Text.Html;
    this.Page.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + System.IO.Path.GetFileName("title.url") + "\"");

    this.Page.Response.Flush();
    this.Page.Response.End();

    Вот в таком виде просто сохраняется файл title.url. А как здесь дописать путь ярлыка вида:

    \\test.ru\folder\folder\....

    4 декабря 2014 г. 7:57
  • Да, все верно
    4 декабря 2014 г. 11:51
  • Вот что должно у Вас быть в событии PageLoad:

    	    MemoryStream MemoryStream = new MemoryStream();
                TextWriter TextWriter = new StreamWriter(MemoryStream);
                TextWriter.WriteLine("[InternetShortcut]");
                TextWriter.WriteLine("URL=http://www.ulmaskulov.ru");
                TextWriter.Flush();
                byte[] bytes = MemoryStream.ToArray();
                MemoryStream.Close();
    
                Response.Clear();
                Response.ContentType = "application/force-download";
                Response.AddHeader("content-disposition", "attachment;    filename=short.url");
                Response.BinaryWrite(bytes);
                Response.End();  

    Только Вам надо разный контент генерить, точнее ссылку в ярлыке.
    Используя JavaScript, передавайте параметры и считывайте их через QueryString.

    • Помечено в качестве ответа ilya83 4 декабря 2014 г. 12:46
    4 декабря 2014 г. 12:12
  •  Александр. Я все понял. Все отлично работает. Спасибо огромное.

    Вставил только вместо URL другую строку:

    TextWriter.WriteLine(@"URL=\\site.ru\folder");

    Теперь у меня открывается сразу проводник. То что нужно.

    А вот такой ContentType = "application/force-download" я вообще 1 раз вижу.

    Еще раз спасибо

    4 декабря 2014 г. 12:46
  • application/force-download просит браузер сразу качать файл, даже если он может его просмотреть.

    Точнее выдать диалог на скачку.

    • Изменено Alexander Ulmaskulov 4 декабря 2014 г. 12:52
    • Помечено в качестве ответа ilya83 4 декабря 2014 г. 12:58
    4 декабря 2014 г. 12:52