我有一个要求
将文件上传到分拣文件夹时,文件将被上传 具有.tmp(或)._(或).filepart扩展名并且成功后 上传文件将重命名为原始文件名。
这是必需的,以避免通过SFTP文件夹侧的设置部分提取.xml文件。
例如使用.xml.tmp上传,成功上传后,将文件重命名为.xml
关于如何在MVC,C#中实现此目标的任何想法。
答案 0 :(得分:1)
我希望完全在单独的文件夹中执行此操作。然后移至拾取文件夹。
然后不需要重命名。
private bool IsFileLocked()
{
try
{
FileStream fs = File.OpenWrite(FilePath);
fs.Close();
return false;
}
catch (Exception)
{
Console.WriteLine("File locked: " + FileName);
return true;
}
}
要在尝试发送之前检查文件是否已锁定,也可能会起作用或结合使用。
我说的是先生成一个本地文件,一旦完成完全写入,只需使用File.Move()方法,然后将新生成的文件从其“安全”文件夹移至拾取文件夹, SFTP一直在寻找文件。
如果它正在捡起您要接收的文件,那么这只是尝试对其进行任何处理之前的检查。
答案 1 :(得分:0)
首先,一旦您从帖子中接收到文件流,就表示上传已经“成功”(很有可能)。因此,当您从帖子中获取数据时,您应该已经可以很好地编写它了。我在这里可以远程看到的唯一一点是,远程进程要么不断检查.xml文件,所以让我们说一下.xml文件是否很大,并假设(事实并非如此)您需要花一些时间来编写流到远程目标,他们不想只检查xml的一部分,他们需要全部。如果是这样,应该执行以下操作(根据您的需要进行修改);
[HttpPost]
public ActionResult Upload()
{
if (Request.Files.Count < 1)
{
ViewBag.Result = "No files were provided";
return PartialView("Error");
}
foreach (string F in Request.Files)
{
var FInfo = Request.Files[F];
var TemporaryFileName = $"{FInfo.FileName}.tmp";
try
{
using (var FStream = new FileStream(TemporaryFileName, FileMode.Create, FileAccess.Write))
{
FInfo.InputStream.CopyTo(FStream);
}
}
catch (Exception e)
{
ViewBag.Result = e.Message;
return PartialView("Error");
}
finally
{
System.IO.File.Move(TemporaryFileName, $"{FInfo.FileName}");
}
}
ViewBag.Result = "Files have been uploaded";
return View();
}