public ActionResult DeleteAssignmentFile(int courseID, int assignmentID, string fileName) { //Get the filename from the path fileName = System.IO.Path.GetFileName(fileName); // Get the attributable file storage OSBLEDirectory attrFiles = OSBLE.Models.FileSystem.Directories.GetAssignment(courseID, assignmentID).AttributableFiles; //If no files exist return to the assignment details page. if (null == attrFiles) { return(Index(assignmentID)); } if (fileName != null) { int slashIndex = fileName.LastIndexOf('\\'); if (-1 == slashIndex) { slashIndex = fileName.LastIndexOf('/'); } if (-1 != slashIndex) { // If the file exists in some nested folders then get the // correct directory object first. attrFiles = (OSBLEDirectory)attrFiles.GetDir(fileName.Substring(0, slashIndex)); // Also remove the path from the beginning of the file name fileName = fileName.Substring(slashIndex + 1); } } // Perform the actual deletion attrFiles.DeleteFile(fileName); //Return to the assignment details page return(Index(assignmentID)); }
public ActionResult CourseDocument(int courseId, string filePath) { var course = (from c in db.CourseUsers where c.UserProfileID == CurrentUser.ID && c.AbstractCourseID == courseId select c).FirstOrDefault(); if (course != null) { //build the file path string[] pathPieces = filePath.Split('/'); OSBLEDirectory fsPath = Models.FileSystem.Directories.GetCourseDocs(courseId); for (int i = 0; i < pathPieces.Length - 1; i++) { fsPath = fsPath.GetDir(pathPieces[i]); } string fullPath = fsPath.File(pathPieces[pathPieces.Length - 1]).FirstOrDefault(); string fileName = Path.GetFileName(fullPath); //if the file ends in a ".link", then we need to treat it as a web link if (Path.GetExtension(fileName).ToLower().CompareTo(".link") == 0) { string url = ""; //open the file to get at the link stored inside using (TextReader tr = new StreamReader(fullPath)) { url = tr.ReadLine(); } Response.Redirect(url); //this will never be reached, but the function requires an actionresult to be returned return(new EmptyResult()); } else { Stream fileStream = null; try { fileStream = fsPath.File(pathPieces[pathPieces.Length - 1]).ToStreams().FirstOrDefault().Value; } catch (Exception) { //file not found } if (fileStream == null) { return(RedirectToAction("Index", "Home")); } //else just return the file if (Path.GetExtension(filePath).ToLower() == ".pdf") { Response.AppendHeader("content-disposition", "inline; filename=" + fileName); return(new FileStreamResult(fileStream, "application/pdf")); } else { return(new FileStreamResult(fileStream, "application/octet-stream") { FileDownloadName = fileName }); } } } return(RedirectToAction("Index", "Home")); }
private void HandleFileDeletionRequest(HttpContext context, Models.Users.UserProfile up, int courseID) { // Make sure they have access to this course. Right now we only let // people who can modify the course have access to this service function. if (!VerifyModifyPermissions(context, up, courseID)) { return; } // The permission-oriented attributes depend on the course user OSBLEContext db = new OSBLEContext(); CourseUser courseUser = (from cu in db.CourseUsers where cu.UserProfileID == up.ID && cu.AbstractCourse is AbstractCourse && cu.AbstractCourseID == courseID select cu).FirstOrDefault(); if (null == courseUser) { WriteErrorResponse(context, "User does not have permission to view or modify files in this course."); return; } // Make sure the file name parameter is present string fileName = string.Empty; if (!VerifyStringParam(context, "file_name", ref fileName)) { return; } if (string.IsNullOrEmpty(fileName)) { WriteErrorResponse(context, "The following parameter cannot be an empty string: file_name"); return; } // Make sure the file path name is OK (doesn't go up a level with ../ or // other things like that) if (!VerifyPath(context, ref fileName)) { return; } // Get the attributable file storage OSBLEDirectory courseFiles = Models.FileSystem.Directories.GetCourseDocs(courseID); OSBLEDirectory attrFiles = courseFiles; if (null == attrFiles) { WriteErrorResponse(context, "Internal error: could not get attributable files manager for course files."); return; } int slashIndex = fileName.LastIndexOf('\\'); if (-1 == slashIndex) { slashIndex = fileName.LastIndexOf('/'); } if (-1 != slashIndex) { // If the file exists in some nested folders then get the // correct directory object first. attrFiles = (OSBLEDirectory)attrFiles.GetDir(fileName.Substring(0, slashIndex)); // Also remove the path from the beginning of the file name fileName = fileName.Substring(slashIndex + 1); } // Perform the actual deletion attrFiles.DeleteFile(fileName); // Return success message with new file listing context.Response.Write( "<CourseFilesOpsResponse success=\"true\">" + courseFiles.GetXMLListing(courseUser, true) + "</CourseFilesOpsResponse>"); }
private void HandleFileRenameRequest(HttpContext context, Models.Users.UserProfile up, int courseID, CourseUser courseUser) { // Make sure they have access to this course. Right now we only let // people who can modify the course have access to this service function. if (!VerifyModifyPermissions(context, up, courseID)) { return; } // Make sure the file name parameter is present string fileName = string.Empty; if (!VerifyStringParam(context, "file_name", ref fileName)) { return; } if (string.IsNullOrEmpty(fileName)) { WriteErrorResponse(context, "The following parameter cannot be an empty string: file_name"); return; } // Make sure the path name is OK if (!VerifyPath(context, ref fileName)) { return; } // Get the attributable file storage OSBLEDirectory courseFiles = Models.FileSystem.Directories.GetCourseDocs(courseID); OSBLEDirectory attrFiles = courseFiles; if (null == attrFiles) { WriteErrorResponse(context, "Internal error: could not get attributable files manager for course files."); return; } int slashIndex = fileName.LastIndexOf('\\'); if (-1 == slashIndex) { slashIndex = fileName.LastIndexOf('/'); } if (-1 != slashIndex) { // If the file exists in some nested folders then get the // correct directory object first. attrFiles = (OSBLEDirectory)attrFiles.GetDir(fileName.Substring(0, slashIndex)); // Also remove the path from the beginning of the file name fileName = fileName.Substring(slashIndex + 1); } // Now make sure we have the new_name parameter string newName = string.Empty; if (!VerifyStringParam(context, "new_name", ref newName)) { return; } // Verify that it's OK if (!VerifyPath(context, ref newName)) { return; } // Also it must be just the new file name and not have / or \ if (newName.Contains('/') || newName.Contains('\\')) { WriteErrorResponse(context, "New file name must not contain a path, just the new file name."); return; } // Lastly, it must not be empty if (string.IsNullOrEmpty(newName)) { WriteErrorResponse(context, "New file name cannot be empty."); return; } // Tell the file storage to do the rename if (attrFiles.RenameFile(fileName, newName)) { // Return success message with new file listing context.Response.Write( "<CourseFilesOpsResponse success=\"true\">" + courseFiles.GetXMLListing(courseUser, true) + "</CourseFilesOpsResponse>"); } else { WriteErrorResponse(context, "Failed to rename file."); } }
public void ProcessRequest(HttpContext context) { HttpFileCollection coll; //yc: set the max upload size try { coll = context.Request.Files; context.Response.ContentType = "text/xml"; if (0 == coll.Count) { WriteErrorResponse(context, "Course file upload service requires one or more files in the request. " + "It's possible that your browser did not correctly send the file data " + "and you may need to update your browser if the problem persists."); return; } // We're expecting the course ID to be in a parameter (required) string courseIDParam = context.Request.Params["courseID"]; if (string.IsNullOrEmpty(courseIDParam)) { WriteErrorResponse(context, "Course file upload service requires a \"courseID\" parameter."); return; } // Make sure the course ID is an integer and a valid course ID at that int courseID; if (!int.TryParse(courseIDParam, out courseID)) { WriteErrorResponse(context, "The course ID must be a valid integer value."); return; } // There might be an optional "target_folder" parameter string targetFolderParam = context.Request.Params["target_folder"]; // Try to get the current OSBLE user Models.Users.UserProfile up = OSBLE.Utility.OsbleAuthentication.CurrentUser; if (null == up) { // In the future what I'd like to do here is look for a user name and // password in the request headers. This would allow this web service to // be used by other sources, but for now it requires a logged in OSBLE user. WriteErrorResponse(context, "Could not get active OSBLE user for request. Please login."); return; } // Make sure this user has permission to upload to this course OSBLEContext _db = new OSBLEContext(); CourseUser courseUser = ( from cu in _db.CourseUsers where cu.UserProfileID == up.ID && cu.AbstractCourse is AbstractCourse && cu.AbstractCourseID == courseID select cu ).FirstOrDefault(); if (null == courseUser || !courseUser.AbstractRole.CanUploadFiles) { // User cannot upload files for this course context.Response.Write( "<CourseFilesUploaderResponse success=\"false\">" + " <Message>The specified user does not have access to course with ID=" + courseID.ToString() + ". User must be " + "a course owner to access this service.</Message>" + "</CourseFilesUploaderResponse>"); return; } // We will look for an optional "fileusage" parameter that tells us where // the file(s) will go. By default we use "generic" if the parameter is // absent. string fileUsage = context.Request.Params["fileusage"]; if (string.IsNullOrEmpty(fileUsage)) { // Default to "generic", which puts files in the CourseDocs folder. fileUsage = "generic"; } else { fileUsage = fileUsage.ToLower(); } // Save based on the usage if ("generic" == fileUsage) { OSBLEDirectory location = Models.FileSystem.Directories.GetCourseDocs(courseID); // For now the target folder parameter is only allowed for generic files if (!string.IsNullOrEmpty(targetFolderParam) && "\\" != targetFolderParam && "/" != targetFolderParam) { // We can't let it start with / or \ while (targetFolderParam.StartsWith("\\")) { targetFolderParam = targetFolderParam.Substring(1); } while (targetFolderParam.StartsWith("/")) { targetFolderParam = targetFolderParam.Substring(1); } location = location.GetDir(targetFolderParam); if (null == location) { WriteErrorResponse(context, "Could not upload to target folder: " + targetFolderParam); return; } } // Save each file to the target directory for (int i = 0; i < coll.Count; i++) { HttpPostedFile postedFile = coll[i]; //yc: check the file size in MB int size = postedFile.ContentLength / 1024 / 1024; //contentLenght(BYTES)/ 1024 (gets KB) / 1024 (GETS MB) if (size < 30) { } else { //too large } string fileName = Path.GetFileName(postedFile.FileName); location.AddFile(fileName, postedFile.InputStream); } context.Response.Write(string.Format( "<CourseFilesUploaderResponse success=\"true\">" + " <Message>Successfully uploaded {0} files</Message>" + "</CourseFilesUploaderResponse>", coll.Count)); return; } else if ("assignment_description" == fileUsage || "assignment_solution" == fileUsage) { // In this case we also need an assignment ID parameter string aIDString = context.Request.Params["assignmentID"]; if (string.IsNullOrEmpty(aIDString)) { WriteErrorResponse(context, "An \"assignmentID\" parameter is required when uploading a " + "file for an assignment " + (("assignment_description" == fileUsage) ? "description." : "solution.")); return; } int aID; if (!int.TryParse(aIDString, out aID)) { WriteErrorResponse(context, "The \"assignmentID\" parameter must be an integer value."); return; } // Assignment must exist Models.FileSystem.AssignmentFilePath afs = Models.FileSystem.Directories.GetAssignment(courseID, aID); if (null == afs) { WriteErrorResponse(context, "Could not get assignment file path for assignment: " + aIDString); return; } // Get the attributable files storage for this assignment OSBLE.Models.FileSystem.OSBLEDirectory attrFiles = afs.AttributableFiles; if (null == attrFiles) { WriteErrorResponse(context, "Internal error: could not get attributable files manager for assignment"); return; } // Set up the system attributes for this file Dictionary <string, string> sys = new Dictionary <string, string>(); sys.Add("created", DateTime.Now.ToString()); sys.Add(fileUsage, aIDString); sys.Add("uploadedby", up.UserName); if ("assignment_solution" != fileUsage) { sys.Add("any_course_user_can_download", null); } // Save each file to the target directory for (int i = 0; i < coll.Count; i++) { HttpPostedFile postedFile = coll[i]; string fileName = Path.GetFileName(postedFile.FileName); attrFiles.AddFile(fileName, postedFile.InputStream, sys, null); } context.Response.Write(string.Format( "<CourseFilesUploaderResponse success=\"true\">" + " <Message>Successfully uploaded {0} files</Message>" + "</CourseFilesUploaderResponse>", coll.Count)); return; } // Coming here implies we didn't recognize the file usage WriteErrorResponse(context, "Unsupported file usage: " + fileUsage); } catch (HttpException ex) { if (ex.WebEventCode == 3004) { WriteErrorResponse(context, "File exceeds 30MB upload limit"); return; } } // This web service returns XML }