У меня есть код, который принимает загрузку, скачивание, удаление файлов на 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
Я загрузил png-файл с именем virtual_box, и его хеш, сгенерированный моим MD5, был 6da442ab0fad247e00d1ea86f246beb2, и когда я совмещался сХэш Google Drive, это было то же самое.