Как отменить и удалить загружаемый файл в asp.net mvc 3? - PullRequest
2 голосов
/ 11 октября 2011

Я использую файловый поток для получения большого файла в моем контроллере. коды ниже:

[HttpPost]
public JsonResult Create(string qqfile, Attachment attachment)
{
    Stream inputStream = HttpContext.Request.InputStream;
    string fullName = ingestPath + Path.GetFileName(qqfile);


    using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
    {
        try
        {
            var buffer = new byte[1024];

            int l = inputStream.Read(buffer, 0, 1024);
            while (l > 0)
            {
                fs.Write(buffer, 0, l);
                l = inputStream.Read(buffer, 0, 1024);
            }
            return Json(new {success = "true"});
        }
        catch (Exception)
        {
            return Json(new {success = "false"});
        }
        finally
        {
            inputStream.Flush();
            inputStream.Close();

            fs.Flush();
            fs.Close();
        }
    }
}

И в методе ajax моей страницы я добавляю кнопку, чтобы отменить загрузку файла и удалить незаконченный файл с диска. Запрос Ajax к действию с именем «Отмена»:

        [HttpPost]
    public JsonResult Cancel(string filename)
    {
        string localName = HttpUtility.UrlDecode(filename);
        string fullName = ingestPath + Path.GetFileName(localName);
        if (System.IO.File.Exists(fullName))
        {
            System.IO.File.Delete(fullName);
        }
        return Json(new {cancle = true});
    }

Проблема в том, что файл не может быть удален, а сообщение об исключении -

процесс не может получить доступ к файлу 'e: \ tempdata \ filename_xxx.xxx', потому что он используется другим процессом.

Я думаю, что это потому, что файловый поток этого файла не закрыт. Как я могу закрыть этот поток файлов и удалить файл в моем действии «Отмена»?

-

OH! Я нашел способ решить это сейчас.

using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))

Это просто, просто объявите свойство fileshare: FileShare.Delete

using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write, FileShare.Delete))

Я потратил 4 часа на Google, отладку и тестирование, а также попытался решить его. Всего через 10 минут после того, как я спросил stackoverflow, я получил ответ сам. Интересно! И надеюсь, что это кому-то тоже пригодится.

1 Ответ

0 голосов
/ 11 октября 2011

Вы можете поместить этот файловый поток в сеанс, а затем использовать этот сеанс в действии отмены, чтобы закрыть поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...