繁体   English   中英

从ASP.NET C#中的Web服务器将文件下载到客户端的PC

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM