Загрузить вложение Infopath на Sharepoint - PullRequest
0 голосов
/ 14 июля 2011

Из очень немногих способов, которые я видел, чтобы загрузить вложение в infopath в библиотеку sharepoint, ни один из них не казался очень упрощенным, и все они включали код на стороне сервера.Что я слышал от всего этого, так это то, что файл хранится в зашифрованном виде base64 внутри шаблона xml формы.

У меня есть полный доступ javascript / jQuery к DOM формы на странице sharepoint, но яУ меня возникают трудности с поиском точного местоположения этой строки base64.

Обратите внимание, я пытаюсь получить base64 вложения ДО отправки формы, я предполагаю, что это где-то в DOM, но яне могу понять где.Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Я нашел решение, которое использует jQuery и код C # позади страниц. Вот часть jQuery:

$.getJSON('_vti_bin/listdata.svc/<NAME OF LIST (FORMATTED FOR LISTDATA.SVC)>', function(data){
  $.each(data.d.results, function(index, value){
    $.get('<NAME OF LIST>/'+value.Title+"?noredirect=true", function(info){
      $.post('<PATH TO filecreator.aspx>, {file: $(info).find('[nodeName="my:memo"]').text()}, function(data){
        $('#response').html(data);
      });
    });
  });
});

HTML является достаточно простым <div id="response"></div>, предназначенным только для получения данных.

Вот файл filecreator.aspx:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Text" %>
<script runat="server">
  public void Page_Load(object sender, EventArgs e){
    int fileSize, nameLength;
    string name = "";
    byte[] decodedData;
    HttpContext c = HttpContext.Current;
    string data64 = c.Request["file"];
    if(data64==""){
      return;
    }
    byte[] data = Convert.FromBase64String(data64);
    using(MemoryStream ms = new MemoryStream(data)){
      BinaryReader reader = new BinaryReader(ms);
      byte[] header = new byte[16];
      header = reader.ReadBytes(header.Length);

      fileSize = (int)reader.ReadUInt32();
      nameLength = (int)reader.ReadUInt32() * 2;

      byte[] fileName = reader.ReadBytes(nameLength);
      Encoding enc = Encoding.Unicode;
      name = enc.GetString(fileName, 0, nameLength -2);
      decodedData = reader.ReadBytes(fileSize);
    }
    string filePath = Server.MapPath("/temp/"+name);
    if(File.Exists(filePath)){
        File.Delete(filePath);
    }
    FileStream fs = new FileStream(filePath, FileMode.CreateNew);
    BinaryWriter writer = new BinaryWriter(fs);
    writer.Write(decodedData);

    writer.Close();
    fs.Close();
    Response.Write("<a href=\"http://sharept03sb1/services/?download.aspx?file="+name+"\">"+name+"</a><br />");
  }
</script>

И, наконец, это файл download.aspx, который запускает загрузку, сейчас он уязвим для lfi, и я отмечу, где это должно быть исправлено:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Text" %>
<script runat="server">
  public void Page_Load(object sender, EventArgs e){
    string name = Request.QueryString["file"]; // HERE: Make sure to prevent lfi via directory traversal :)
    FileStream fs = File.Open(Server.MapPath("/temp/"+name), FileMode.Open);
    byte[] file = new byte[fs.Length];
    fs.Read(file, 0, Convert.ToInt32(fs.Length));
    fs.Close();
    Response.AddHeader("Content-disposition", "attachment; filename=" + name);
    Response.ContentType = "application/octet-stream";
    Response.BinaryWrite(file);
    Response.End();
  }
</script>

Пара советов:

  • Если вы что-то говорите о неработающих блоках кода, обязательно изучите PageParserPaths в файле sharepoint web.config. Вам нужно это изменить.
  • Это обеспечивает только ссылки загрузки для каждого вложения в библиотеке документов, содержащей формы infopath. Конечно, вы можете использовать параметризованные запросы для фильтрации определенных данных.
0 голосов
/ 17 июля 2011

Прежде всего - убедитесь, что вы не смешиваете XML DOM документа InfoPath с HTML DOM HTML-страницы.

Второе - когда речь идет о InfoPath: «XML-шаблон» - это XML, который хранится внутри XSN и используется в качестве первоначального (пустого) документа для этой формы XSN. Поскольку вы говорите «перед отправкой формы», я предполагаю, что вы на самом деле говорите об XML-документе (форме), созданном с помощью этого XSN.

Можно добавить вложение в XML-документ InfoPath, хранящийся в библиотеке документов, используя JavaScript напрямую (открыть XML с сервера, заменить значение узла, сохранить его обратно). Код будет немного более сложным, чем код на стороне сервера в C # / VB.Net, поэтому ... Поиск узла с XPath или JQuery не должен быть слишком сложным, но это зависит от формы.

Также я думаю, что вы пытаетесь изменить XML, открытый в данный момент с помощью Forms Server, путем взлома HTML-рендеринга страницы. Я бы этого не делал:

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