我找到了一个在页面后面使用 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>
几个提示:
- 如果您遇到有关代码块不起作用的问题,请确保对 sharepoint 的 web.config 文件中的 PageParserPaths 进行一些研究。你需要改变它。
- 这只会为包含信息路径表单的文档库中的每个附件提供下载链接。您当然可以使用参数化查询来过滤某些数据。