This code basically saves an uploaded file to the server. I am wondering if there is anything that I can do to tighten this code up. I am very new to F# so I'm still having trouble breaking away from the C# way of doing things.
/// Create file paths
/// Returns a tuple (server path * link path * file number)
let createPath (file : HttpPostedFileBase) =
// server directory path
let serverDirPath =
HttpContext.Current.Server.MapPath(@"~/Uploads")
// get the file name
let origFileName = file.FileName
// get the extension
let extension = Path.GetExtension(origFileName)
// get the file size in bytes
let fileSize = file.ContentLength
// directory check
let pathExists() = Directory.Exists(serverDirPath)
// create directory
let createDir() =
if not (pathExists()) then
Directory.CreateDirectory(serverDirPath) |> ignore
createDir()
// find current file name
let findCurrentFileName() =
// check if row exist
let rowCount =
query{
for row in db.Uploads do
select row
count
}
// get file number
let fileNumber =
if rowCount < 1
then
1
else
query{
for row in db.Uploads do
select (row.FileNumber + 1)
head
}
// final path
let finalServPath =
serverDirPath + @"\" + fileNumber.ToString() + extension
// download link
let linkPath =
finalServPath.Replace(serverDirPath + @"\", @"~/Uploads/")
finalServPath, linkPath, fileNumber
findCurrentFileName()
/// Save file to server and path to db.
let SaveUpload (file: HttpPostedFileBase) (title : string) =
// create the path including filename
let servPath, linkPath, fileNumber = createPath file
// save file to server
file.SaveAs(servPath)
// create new row for db table
let newUpload =
new dbSchema.ServiceTypes.Uploads(Title = title,
FilePath = servPath,
Size = file.ContentLength.ToString(),
FileNumber = fileNumber,
LinkPath = linkPath)
// insert new row
insertRowIn db.Uploads newUpload
// save to db
saveToDb()
createPath
's return value instead of using a 3-tuple. The only other observation is it's unnecessary to check if a directory exists before callingCreateDirectory
. It already does that check for you. \$\endgroup\$type PathInfo = { ServerPath: string; LinkPath: string; FileNumber: int }
\$\endgroup\$