public string Create(byte[] data, string filename) { if (data == null || data.Length == 0) { throw new ArgumentNullException("data"); } var extension = Path.GetExtension(filename); var fileType = FileTypeUtil.DeduceFileTypeFromExtension(extension); var now = DateTime.Now; //路径: [文件类型]/[年]/[月日]/[Encode[毫秒]][Encode[随机串]].后缀 //例如:IMAGE/2016/0314/Xb4J3ims7gC4Qyk4.jpg //注意:文件名区分大小写,必须使用Linux文件系统 //文件句柄: 文件类型年月随机字符串.后缀 //其中文件类型取类型名称的前五个字符,命名时应该注意! //c# GUID目前采用算法4 即前12位是随机数 //xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx var rnd = BitConverter.ToInt64(Guid.NewGuid().ToByteArray().Take(48).ToArray(), 0); var fileTypeName = fileType.ToString().Substring(0, 5).PadLeft(5, '0').ToUpper(); var year = string.Format("{0:yyyy}", now); var monthAndDay = string.Format("{0:MMdd}", now); var fileName = string.Format("{0}{1}{2}", Encode(GetMillisecondsOfADay(now)), Encode(rnd), extension); var fileHandle = string.Format("{0}{1}{2}{3}", fileTypeName, year, monthAndDay, fileName); var file = new FileMetadata() { FileHandle = fileHandle, Size = data.Length, Name = filename, CreatedAt = now, FileType = (int)fileType, Path = Path.Combine(fileTypeName, year, monthAndDay), MimeType = MimeTypeUtil.GetMimeType(extension) }; //save it try { var directory = Path.Combine(fileTypeName, year, monthAndDay); if (!DirectoryExists(directory)) { if (!DirectoryExists(Path.Combine(fileTypeName, year))) { if (!DirectoryExists(fileTypeName)) { MakeDirectory(fileTypeName); } MakeDirectory(Path.Combine(fileTypeName, year)); } MakeDirectory(directory); } var ftpRequest = CreateRequest(Path.Combine(directory, fileName)); ftpRequest.Method = WebRequestMethods.Ftp.UploadFile; ftpRequest.ContentLength = data.Length; using (var requestStream = ftpRequest.GetRequestStream()) { requestStream.Write(data, 0, data.Length); } using (var response = ftpRequest.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { } try { var md5 = new MD5CryptoServiceProvider().ComputeHash(data); file.Md5 = BitConverter.ToString(md5).Replace("-", string.Empty); //todo insert file meta } catch (System.Exception error) { _logger.Error(string.Format("save filemetadata{0} error", fileHandle), error); } } catch (System.Exception error) { _logger.Error(string.Format("create error[{0}]", fileHandle), error); return(null); } return(fileHandle); }
public string Create(byte[] content, string filename) { var extension = Path.GetExtension(filename); var fileType = FileTypeUtil.DeduceFileTypeFromExtension(extension); var now = DateTime.Now; //路径: [文件类型]/[年]/[月日]/[Encode[毫秒]][Encode[随机串]].后缀 //文件句柄: 文件类型年月随机字符串.后缀 //其中文件类型取类型名称的前五个字符,命名时应该注意! var rnd = BitConverter.ToInt64(Guid.NewGuid().ToByteArray().Take(48).ToArray(), 0); var fileTypeName = fileType.ToString().Substring(0, 5).PadLeft(5, '0').ToUpper(); var year = string.Format("{0:yyyy}", now); var monthAndDay = string.Format("{0:MMdd}", now); var fileName = string.Format("{0}{1}{2}", Encode(GetMillisecondsOfADay(now)), Encode(rnd), extension); var fileHandle = string.Format("{0}{1}{2}{3}", fileTypeName, year, monthAndDay, fileName); var file = new FileMetadata() { FileHandle = fileHandle, Size = content.Length, Name = filename, CreatedAt = now, FileType = (int)fileType, Path = Path.Combine(fileTypeName, year, monthAndDay), MimeType = MimeTypeUtil.GetMimeType(extension) }; //save file var directory = Path.Combine(BaseDirectory, fileTypeName, year, monthAndDay); try { if (!Directory.Exists(directory)) { if (!Directory.Exists(Path.Combine(BaseDirectory, fileTypeName, year))) { if (!Directory.Exists(Path.Combine(BaseDirectory, fileTypeName))) { Directory.CreateDirectory(Path.Combine(BaseDirectory, fileTypeName)); } Directory.CreateDirectory(Path.Combine(BaseDirectory, fileTypeName, year)); } Directory.CreateDirectory(directory); } } catch (Exception error) { _logger.Debug(string.Format("create directory error[{0}]", directory), error); } try { System.IO.File.Create(Path.Combine(directory, fileHandle)); //TODO save metadata to database } catch (Exception error) { _logger.Error(string.Format("create error[{0}]", fileHandle), error); return(null); } return(fileHandle); }