.net Sensenet:通过Sensenet客户端API下载文件
我正试图通过ClientAPI获取sensenet上存在的文件流。但是我没有找到任何关于这个的文档。 我还尝试使用RestCaller,但我不知道如何获取输入参数FieldID。。。通过文件路径(例如:/Root/Sites/Test/file.txt) 我有一个服务器api,它封装了来自客户端应用程序的sensenet内容。因此,sensenet上的请求都在服务器端。 我试图获取contentId为的流文件。。。但是它不会带来Content.Result(带来ID的对象(我猜…)的ID。例如,返回值为: content=Id=1016,Status=WaitingForActivation,Method=“{null}”,Result=“{Not Not computed}” 这是我的密码:.net Sensenet:通过Sensenet客户端API下载文件,.net,sensenet,.net,Sensenet,我正试图通过ClientAPI获取sensenet上存在的文件流。但是我没有找到任何关于这个的文档。 我还尝试使用RestCaller,但我不知道如何获取输入参数FieldID。。。通过文件路径(例如:/Root/Sites/Test/file.txt) 我有一个服务器api,它封装了来自客户端应用程序的sensenet内容。因此,sensenet上的请求都在服务器端。 我试图获取contentId为的流文件。。。但是它不会带来Content.Result(带来ID的对象(我猜…)的ID。例如,
var fileId = SenseNet.Client.Content.LoadAsync(parentPath).Result.Id;
var req = RESTCaller.GetStreamRequest(fileId);
try
{
using (var response = await req.GetResponseAsync())
{
using (var stream = response.GetResponseStream())
{
using (var streamReader = new MemoryStream())
{
stream.CopyTo(streamReader);
return streamReader.ToArray();
}
}
}
}
catch (WebException webex)
{
throw await RESTCaller.GetClientExceptionAsync(webex, req.RequestUri.ToString());
}
我猜你指的是一个接一个的fileId。
您要下载的文件通常从UI上的列表中选择。我可以推荐的最佳选择是,您应该获得文件的Id以及用于在列表中显示的其他属性。然后,您只需从列表中获取所选文件,该文件现在具有Id。我希望,我帮助…解决了我的特定问题,我必须创建任务,直接返回它
return Task.Factory.StartNew(() =>
{
using (var content = Content.LoadAsync(path))
{
var fileId = content.Result.Id;
var req = RESTCaller.GetStreamRequest(fileId);
using (var response = req.GetResponse())
{
using (var stream = response.GetResponseStream())
{
using (var streamReader = new MemoryStream())
{
stream.CopyTo(streamReader);
return streamReader.ToArray();
}
}
}
}
}).WaitAndUnwrapException();
一个类似的例子,完全异步。如果可能,请不要将异步API调用转换为同步调用。即使在ASP.NET环境中,也应该可以将方法设计为异步的,而不是强制它们同步运行 下面的示例是一种异步MVC控制器方法。它首先获取文件id(当然,如果您已经有文件id,您可以跳过它),然后下载流并立即将字节写入输出流
public async Task DownloadAsync()
{
var path = "/Root/YourDocuments/test1.txt";
var fileContent = await SNC.Content.LoadAsync(path);
var fileId = fileContent.Id;
var req = SNC.RESTCaller.GetStreamRequest(fileId);
Response.ClearContent();
Response.AddHeader("content-disposition", $"attachment;filename={fileContent.Name}");
Response.ContentType = "text/plain";
Response.ContentEncoding = Encoding.UTF32;
using (var response = await req.GetResponseAsync())
{
using (var stream = response.GetResponseStream())
{
await stream.CopyToAsync(Response.OutputStream);
}
}
Response.End();
}
如果不使用MVC,也可以在HttpTaskAsyncHandler或异步ASP.NET页面上执行相同的操作。如果您希望我们提供更详细的示例,请让我们了解您的环境和业务案例。可以使文件下载完全同步吗?这方面存在一些问题。例如,Content.LoadAsync应该是“等待”的,不能在using语句中使用。使异步API同步是一种不好的做法,请尽量避免。还建议使用流而不是字节数组,以避免在内存中保留大文件。如果您想让您的用户下载文件,您只需直接写入OutputStream即可-请查看我的答案作为示例,并让我了解有关您案例的更多信息:-)