Переименование файла в C# на сервере


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

[HttpPost]
    public ActionResult Upload(HttpPostedFileBase fileData)
    {
        if (fileData != null && fileData.ContentLength > 0)
        {
            //var fileName = Server.MapPath("~/Content/Images/" + Path.GetFileName(fileData.FileName));
            int pictureCount = 800000;
            pictureCount += db.Pictures.Count();
            string extension = Path.GetExtension(fileData.FileName);
            string renamedImage = Server.MapPath("~/Content/Images/Categories/cat" + pictureCount + extension);
            fileData.SaveAs(renamedImage);
            return Json(Path.GetFileName(renamedImage));
        }
        return Json(false);
    }


14696
2
задан 4 декабря 2011 в 08:12 Источник Поделиться
Комментарии
2 ответа

Если у вас есть два одновременных загрузок файла БД.Фотографии.Граф(); будет возвращать одинаковое количество. Так вы получите конфликт.

Если дБ.Фотографии-это база данных, то можно создать и автоматический поля личности инкремента и использовать его, чтобы сохранить файл.

Если нет варианта с базой данных вы можете использовать более двух подходов:
Использовать GUID вместо имени картинки

[HttpPost]
public ActionResult Upload(HttpPostedFileBase fileData)
{
if (fileData != null && fileData.ContentLength > 0)
{
string extension = Path.GetExtension(fileData.FileName);

string renamedImage = null;
do
{
renamedImage = Server.MapPath("~/Content/Images/Categories/cat" + System.Guid.NewGuid().ToString("N") + extension);

} while( /*verify that renamedImage file does not exist*/ );

fileData.SaveAs(renamedImage);
return Json(Path.GetFileName(renamedImage));
}
return Json(false);
}

Недостатком этого подхода является то, что можно загружать картинки на сервер.

Чтобы смягчить, что вы можете попробовать, используя хэш-образа в качестве имени файла. Прежде чем писать содержимое файла на проверку диска, если этот файл уже существует. Примечание: проверка и сохранение файла работы должны быть выполнены в потокобезопасным способом.

3
ответ дан 4 декабря 2011 в 08:12 Источник Поделиться

Вам непременно следует сохранить файл с GUID в имени файла (или даже сохранить его в базе данных в тип varbinary(Max)в столбце или в файлового потока колонка (которая на самом деле выполняет ее на диск).

Я также, как правило, для хранения тип MIME, так что я знаю, как отобразить файл в браузере (не обязательно в вашем случае, но думаю, что произойдет, если вы продлите этот параметр, чтобы разрешить загрузку PDF-файлов и т. д., которые я обычно делаю).

Когда я разрешаю загрузки файлов я, как правило, для хранения такого рода данных и есть GUID в качестве первичного ключа в базе данных:

// postedFile is the HttpPostedFileBase
uploadedFile.MimeType = postedFile.ContentType;
uploadedFile.FileData = new byte[postedFile.ContentLength];
postedFile.InputStream.Read(uploadedFile.FileData, 0, postedFile.ContentLength);
uploadedFile.FileHash = _uploadedFileService.ComputeFileHash(uploadedFile.FileData); // see below for this code
uploadedFile.UserId = User.UserId;
uploadedFile.DateCreated = DateTime.UtcNow;
uploadedFile.OriginalFilename = postedFile.FileName;

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

Вот код (если вы знаете, какой ОС вы будете бежать, вы не должны делать чек, очевидно, я просто положил его здесь для вашего блага!):

public byte[] ComputeFileHash(byte[] fileData)
{
if (System.Environment.OSVersion.Version.Major == 5)
{
// Windows XP
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
return md5.ComputeHash(fileData);
}
else
{
// Windows Vista, 7, Server 2008
System.Security.Cryptography.MD5Cng md5 = new System.Security.Cryptography.MD5Cng();
return md5.ComputeHash(fileData);
}
}

1
ответ дан 14 декабря 2011 в 09:12 Источник Поделиться