[英]download file from web server in asp.net c# to client's pc
我正在尝试从服务器下载文件到客户端选择到其计算机上的文件夹。 但我不断收到错误could not find part of the path
例如,DownloadLocation可能是C:/ myfolder
码:
FileName = comp.DownloadLocation + "/" + "/purchase" + ".csv";
regularfilename = "purchase.csv";
byte[] buffer;
using (FileStream fileStream = new FileStream(FileName, FileMode.Open))
{
int fileSize = (int)fileStream.Length;
buffer = new byte[fileSize];
fileStream.Read(buffer, 0, (int)fileSize);
}
Response.Clear();
Response.Buffer = true;
Response.BufferOutput = true;
Response.ContentType = "application/x-download";
Response.AddHeader("Content-Disposition", "attachment; filename=" + regularfilename);
Response.CacheControl = "public";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.Clear();
Response.End();
可能不是答案,但是您绝对应该检查以下内容:
FileName = comp.DownloadLocation + "/" + "/purchase" + ".csv";
您可能要在购买前删除/或完全删除+“ /” +,因为这样会建立以下格式的路径:
“ somepath // purchase.csv”
可能是造成您的问题的原因。 看看是否有所作为。
如果您需要客户端应用程序来检查Web API服务器以查看服务器的文件版本是否比客户端具有的版本新,则可以通过执行以下步骤来设置服务器:
将适当的方法添加到存储库接口,例如:
HttpResponseMessage GetCervezaBeberUpdate(string clientVersion);
将其添加到相应的Controller类(其中Controller名称为“ HenryFieldingController”):
[Route("api/HenryFielding/GetUpdatedCervezaBeber")]
public HttpResponseMessage GetUpdate(string clientVersion)
{
return _tomJonesRepository.GetCervezaBeberUpdate(clientVersion);
}
将适当的方法添加到具体的Repository类,例如:
public HttpResponseMessage GetCervezaBeberUpdate(string clientVersion)
{
var binaryFilePath = HostingEnvironment.MapPath(@"~\App_Data\CervezaBeber.exe");
FileVersionInfo currentVersion = FileVersionInfo.GetVersionInfo(binaryFilePath);
if (!ServerFileIsNewer(clientVersion, currentVersion))
{
result = new HttpResponseMessage(HttpStatusCode.NoContent);
}
else
{
var stream = new FileStream(binaryFilePath, FileMode.Open);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/octet-stream");
}
return result;
}
还要在该存储库类中添加GetCervezaBeberUpdate()调用的方法:
private bool ServerFileIsNewer(string clientFileVersion, FileVersionInfo serverFile)
{
Version client = new Version(clientFileVersion);
Version server = new Version(string.Format("{0}.{1}.{2}.{3}", serverFile.FileMajorPart, serverFile.FileMinorPart, serverFile.FileBuildPart, serverFile.FilePrivatePart));
return server > client;
}
现在,客户端可以通过将这样的URI传递给服务器来调用它:
http://<servername>:<portnumber>/api/
<controllername>?clientVersion=<clientversionquad>
或者,举一个更直观的例子,如果服务器的名称为“ Platypus”,使用的端口为4242,控制器的名称为HenryFieldingController,客户端当前拥有的文件的版本为3.1.4.1:
http://Platypus:4242/api/HenryFielding?clientVersion=3.1.4.1
作为免费的啤酒(您/我希望!)溢价,这是客户端可以用来将服务器的响应保存到文件中的一些代码(传递此URI,如上所示):
private void DownloadTheFile(string uri)
{
var outputFileName = "Platypus.exe";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
string statusCode = webResponse.StatusCode.ToString();
// From here on (including the CopyStream() method) derived from Jon Skeet's
// answer at http://stackoverflow.com/questions/411592/how-do-i-save-a-stream-to-a-file
if (statusCode == "NoContent")
{
MessageBox.Show("You already have the newest available version.");
}
else
{
var responseStream = webResponse.GetResponseStream();
using (Stream file = File.Create(outputFileName))
{
CopyStream(responseStream, file);
MessageBox.Show(string.Format("New version downloaded to {0}", outputFileName));
}
}
}
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.