gpt4 book ai didi

c# - 维护来自网络响应的文件名

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:09 24 4
gpt4 key购买 nike

我有一个名为 grabFile 的 Web 服务,当我调用它时,它会获取文件的路径和文件名,并将其作为 Stream 返回给我。 Web 服务通过添加 content-Disposition header 来设置文件名。当通过我的服务发出请求时,我会获取响应并将其返回。问题是当直接调用 grabFile Web 服务时(例如,将在我的 Web 请求中看到的地址直接放入我的浏览器地址栏中)文件被下载并且文件具有正确的文件名。但是,当我从我的程序调用 Web 服务并传递流时,它会下载文件但使用默认文件名。当我从我的应用程序返回它时,是否只需要将响应 header 与流一起传递?

private Stream GetFileStream(string fileName)
{
string requestId = Guid.NewGuid().ToString().ToUpper();
string uriTemplate = String.Format("https://www.example.org/grabfile/grabfile.svc/file/myapp/?q={0}&rid={1}",fileName,requestId);
Uri uri = new Uri(uriTemplate);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();

return webResponse.GetResponseStream();

}

最佳答案

GetResponseStream() 方法返回一个仅包含响应主体的流。您可以使用 Headers 属性来获取 Content-Disposition header 值,然后解析它:

string fileName = webResponse.Headers["Content-Disposition"].Replace("attachment; filename=", String.Empty).Replace("\"", String.Empty);

(您可能需要将替换调整为您的 header 值)

所以你可以自己创建一个实体来保存你的请求结果,例如这样的东西:

public class ResponseFileInfo
{
public string Name { get; private set; }

public Stream Content { get; private set; }

public ResponseFileInfo(string name, Stream content)
{
Name = name;
Content = content;
}
}

并且有一个这样的方法:

private ResponseFileInfo GetFile(string fileName)
{
string requestId = Guid.NewGuid().ToString().ToUpper();
string uriTemplate = String.Format("https://www.myDomain.com/grabfile/grabfile.svc/file/myapp/?q={0}&rid={1}&sid={2}",fileName,requestId,this.sid);

MemoryStream fileContent = null;
string fileName = String.Empty;

Uri uri = new Uri(uriTemplate);
using (WebRequest webRequest = WebRequest.Create(uri))
{
using (WebResponse webResponse = webRequest.GetResponse())
{
fileName = webResponse.Headers["Content-Disposition"].Replace("attachment; filename=", String.Empty).Replace("\"", String.Empty);

fileContent = new MemoryStream();
Stream responseStream = webResponse.GetResponseStream();
byte[] responseBuffer = new byte[16*1024];
int responseBytesRead;

while((responseBytesRead = responseStream.Read(responseBuffer, 0, responseBuffer.Length) > 0)
fileContent.Write(responseBuffer, 0, responseBytesRead);
}
}

return new ResponseFileInfo(fileName, fileContent);
}

您还需要记住在完成后调用 ResponseFileInfo.Content 上的 .Dispose()(我会考虑在中实现 IDisposable ResponseFileInfo 并将其包装在 using block 中)。

关于c# - 维护来自网络响应的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com