Файл загружен несмотря на наличие кода для устранения тех же файлов ASP.NET - PullRequest
0 голосов
/ 23 октября 2019

У меня есть код, который принимает загрузку, скачивание, удаление файлов на Google Drive. По сути, если это один и тот же файл, пользователь получает предупреждение о том, что это тот же файл. Если это новый файл, он будет загружен на диск Google, и пользователь получит уведомление о его загрузке. Это код для моего метода uploadFile.

<script>
    $('#fileUpload').click(function (e) {
            if ($('#file').val() === "") {
                Swal.fire({
                    title: 'Nothing',
                    text: 'No file selected',
                    type: 'error',
                    confirmButtonText: 'Again!!',
                    timer: 4000
                });
            }
            else {
                event.preventDefault();
                var formData = new FormData($('form')[0]);

                $.ajax({
                    url: "/Home/UploadFile",
                    type: 'Post',
                    success: function (result) {
                        if (result) {
                            Swal.fire({
                                title: 'Wait awhile...',
                                text: 'File will be uploaded shortly',
                                type: 'success',
                                confirmButtonText: 'Okay, cool',
                                timer: 4000
                            })
                            location.href = "/Home/GetGoogleDriveFiles";
                        } else if (result) {
                            alert("Upload not sucess");
                        }
                    },
                    data: formData,
                    cache: false,
                    contentType: false,
                    processData: false
                });
            }
        }
    );
</script>

Это для моего контроллера FileUpload. Он в основном передает значение true или false из кода C # в контроллер, который затем передается в часть результата.

[HttpPost]
public JsonResult UploadFile(HttpPostedFileBase file)
{
    bool kk = GoogleDriveFilesRepository.FileUpload(file);
    return Json(kk, JsonRequestBehavior.AllowGet);
}

Это мой код загрузки файла C #.

public static bool FileUpload(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        DriveService service = GetService();

        string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),Path.GetFileName(file.FileName));
        file.SaveAs(path);

        HashGenerator(path);  
        if(compareHash(HashGenerator(path)))
        {
            var FileMetaData = new Google.Apis.Drive.v3.Data.File();
            FileMetaData.Name = Path.GetFileName(file.FileName);
            FileMetaData.MimeType = MimeMapping.GetMimeMapping(path);
            FilesResource.CreateMediaUpload request;

            using (var stream = new FileStream(path, FileMode.Open))
            {
                request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                request.Fields = "id";
                request.Upload();
            }

            return true;
        }
        return false;              
    }
    return false;
} 

Теперь проблема, с которой я сталкиваюсь, заключается в том, что при загрузке файла, даже если этотот же файл, он будет загружен, хотя я предполагаю, что я закодировал его так, чтобы он не принимал тот же файл, который уже существует на Google Диске. Я не очень уверен, какую часть я пропускаю.

РЕДАКТИРОВАТЬ: Хэш-генератор и сравнить хэш-код

public static string HashGenerator(string path)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = new FileStream(path, FileMode.Open))
            {
                return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "null").ToLower();
            }
        }
    }

    public static bool compareHash(string path)
    {

        DriveService service = GetService();
        FilesResource.ListRequest FileListRequest = service.Files.List();
        IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
        List<GoogleDriveFiles> FileList = new List<GoogleDriveFiles>();

        foreach (var file in files)
        {
            if (file.Equals(path))
            {
                return false;

            }
            return true;
        }
        return true;

    } 

РЕДАКТИРОВАТЬ 2

public static bool FileUpload(HttpPostedFileBase file)
    {
        if (file != null && file.ContentLength > 0)
        {
            DriveService service = GetService();

           string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),Path.GetFileName(file.FileName));
            file.SaveAs(path);

            var hash =  HashGenerator(path);  
            if(compareHash(path))
            {
                var FileMetaData = new Google.Apis.Drive.v3.Data.File();
                FileMetaData.Name = Path.GetFileName(file.FileName);
                FileMetaData.MimeType = MimeMapping.GetMimeMapping(path);
                FilesResource.CreateMediaUpload request;

                using (var stream = new FileStream(path, FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    request.Upload();
                }

             return true;
            }
            return false;              
        }
        return false;
    } 

    public static string HashGenerator(string path)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = new FileStream(path, FileMode.Open))
            {
                return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
            }
        }
    }

    public static bool compareHash(string hash)
    {

        DriveService service = GetService();
        FilesResource.ListRequest FileListRequest = service.Files.List();
        FileListRequest.Fields = "*";
        IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
        List<GoogleDriveFiles> FileList = new List<GoogleDriveFiles>();

        foreach (var file in files)
        {
            if (file.Md5Checksum.Equals(hash))
            {
                return false;
            }
        }
        return true;       
    }

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

    [HttpPost]
    public JsonResult UploadFile(HttpPostedFileBase file)
    {
        bool kk = GoogleDriveFilesRepository.FileUpload(file);
        return Json(kk, JsonRequestBehavior.AllowGet);
    }
                         event.preventDefault();
                        var formData = new FormData($('form')[0]);

                        $.ajax({
                            url: "/Home/UploadFile",
                            type: 'Post',
                            success: function (result) {
                                if (result) {
                                    Swal.fire({
                                        title: 'Wait awhile...',
                                        text: 'File will be uploaded shortly',
                                        type: 'success',
                                        confirmButtonText: 'Okay, cool',
                                        timer: 4000
                                    })
                                    location.href = "/Home/GetGoogleDriveFiles";

                                } else {
                                    Swal.fire({
                                        title: 'OOps',
                                        text: 'File unable to be uploaded shortly',
                                        type: 'error',
                                        confirmButtonText: 'Okay, then',
                                        timer: 4000
                                    })
                                    location.href = "/Home/GetGoogleDriveFiles";

                                }
                            },
                            data: formData,
                            cache: false,
                            contentType: false,
                            processData: false
                        });

Он по-прежнему принимает тот же файл, даже если он уже существовал ..

РЕДАКТИРОВАТЬ 3 enter image description here

Я загрузил png-файл с именем virtual_box, и его хеш, сгенерированный моим MD5, был 6da442ab0fad247e00d1ea86f246beb2, и когда я совмещался сХэш Google Drive, это было то же самое. enter image description here

1 Ответ

1 голос
/ 24 октября 2019

Похоже, что эта проверка в вашем compareHash методе неверна.

if (file.Equals(path))
{
    return false;
}

Как вы прокомментировали, Md5Checksum - это свойство, с которым вам нужно проверять.

if (file.Md5Checksum.Equals(path))
{
    return false;
}

Также, ваш HashGenerator метод содержит следующую строку:

return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "null").ToLower();

Я думаю, null должен быть удален, так что это выглядит так:

return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();

Конечный результат (с некоторым рефакторингом)будет:

public static bool FileUpload(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        var path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"), Path.GetFileName(file.FileName));
        file.SaveAs(path);

        var hash = CreateHash(path);
        if (!FileAlreadyExists(hash))
        {
            var fileMetaData = new Google.Apis.Drive.v3.Data.File();
            fileMetaData.Name = Path.GetFileName(file.FileName);
            fileMetaData.MimeType = MimeMapping.GetMimeMapping(path);

            FilesResource.CreateMediaUpload request;
            using (var stream = new FileStream(path, FileMode.Open))
            {
                var service = GetService();
                request = service.Files.Create(fileMetaData, stream, fileMetaData.MimeType);
                request.Fields = "id";
                request.Upload();
            }

            return true;
        }
        return false;
    }
    return false;
}

public static string CreateHash(string path)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = new FileStream(path, FileMode.Open))
        {
            return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
        }
    }
}

public static bool FileAlreadyExists(string hash)
{
    var service = GetService();
    var fileListRequest = service.Files.List();
    fileListRequest.Fields = "*";
    var files = fileListRequest.Execute().Files;

    foreach (var file in files)
    {
        if(file.Md5Checksum.Equals(hash))
        {
            return true;
        }
    }
    return false;
}

РЕДАКТИРОВАТЬ 3 enter image description here

Я загрузил png с именем virtual_box образ, и его хэш, сгенерированный моим MD5 был6da442ab0fad247e00d1ea86f246beb2, и когда я совместил с хэшем Google Drive, это было то же самое. enter image description here

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