/// <summary> /// /// </summary> /// <param name="PID"></param> /// <returns></returns> public static Utility_3D.ConvertedModel GetAndConvertModel(String PID) { Utility_3D.ConverterOptions opts = (Utility_3D.ConverterOptions)HttpContext.Current.Session["options"]; string NewModelFormat = (string)HttpContext.Current.Session["format"]; DataAccessFactory factory = new vwarDAL.DataAccessFactory(); vwarDAL.IDataRepository vd = factory.CreateDataRepositorProxy(); ContentObject co = vd.GetContentObjectById(PID, false, false); byte[] filedata = vd.GetContentFileData(PID, co.Location); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + co.Location); HttpContext.Current.Response.ContentType = vwarDAL.DataUtils.GetMimeType(co.Location); Utility_3D _3d = new Utility_3D(); _3d.Initialize(Website.Config.ConversionLibarayLocation); Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D.ConvertedModel model = pack.Convert(new System.IO.MemoryStream(filedata), "temp.zip", NewModelFormat, opts); vd.Dispose(); return(model); }
//write the json file to the response; public static void WriteJSONtoResponse(Stream stream, HttpContext context) { HttpResponse _response = context.Response; byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, (int)stream.Length); Utility_3D _3d = new Utility_3D(); _3d.Initialize(Website.Config.ConversionLibarayLocation); Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D.ConvertedModel model = pack.Convert(new MemoryStream(buffer), "ThisShouldAlwaysBeZip.zip", "json"); Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(model.data); _response.ContentType = "application/octet-stream"; foreach (Ionic.Zip.ZipEntry ze in zip) { if (Path.GetExtension(ze.FileName) == ".json") { MemoryStream mem = new MemoryStream(); ze.Extract(mem); byte[] jsonbuffer = new byte[mem.Length]; mem.Seek(0, SeekOrigin.Begin); mem.Read(jsonbuffer, 0, (int)mem.Length); _response.BinaryWrite(jsonbuffer); return; } } }
/// <summary> /// /// </summary> /// <param name="fileData"></param> /// <param name="clientFileName"></param> /// <param name="creds"></param> /// <param name="format"></param> public static void ServeDocument(Stream fileData, string clientFileName, System.Net.NetworkCredential creds = null, string format = "") { HttpResponse _response = HttpContext.Current.Response; var utility = new Utility_3D(); utility.Initialize(Website.Config.ConversionLibarayLocation); //clear response _response.Clear(); _response.AppendHeader("content-disposition", "attachment; filename=" + clientFileName); //serve file _response.ContentType = vwarDAL.DataUtils.GetMimeType(clientFileName); byte[] data = new byte[fileData.Length]; fileData.Read(data, 0, data.Length); if (Path.GetExtension(clientFileName).Equals(".zip", StringComparison.InvariantCultureIgnoreCase) && !String.IsNullOrEmpty(format)) { Utility_3D.Model_Packager packer = new Utility_3D.Model_Packager(); fileData.Seek(0, SeekOrigin.Begin); var package = packer.Convert(fileData, clientFileName, format); data = package.data; } // _response.End(); }
/// <summary> /// /// </summary> /// <param name="PID"></param> /// <returns></returns> public static Utility_3D.ConvertedModel GetAndConvertModel(String PID) { Utility_3D.ConverterOptions opts = (Utility_3D.ConverterOptions)HttpContext.Current.Session["options"]; string NewModelFormat = (string)HttpContext.Current.Session["format"]; DataAccessFactory factory = new vwarDAL.DataAccessFactory(); vwarDAL.IDataRepository vd = factory.CreateDataRepositorProxy(); ContentObject co = vd.GetContentObjectById(PID, false, false); byte[] filedata = vd.GetContentFileData(PID, co.Location); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + co.Location); HttpContext.Current.Response.ContentType = vwarDAL.DataUtils.GetMimeType(co.Location); Utility_3D _3d = new Utility_3D(); _3d.Initialize(Website.Config.ConversionLibarayLocation); Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D.ConvertedModel model = pack.Convert(new System.IO.MemoryStream(filedata), "temp.zip", NewModelFormat, opts); vd.Dispose(); return model; }
public static FileStatus Convert() { Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D _3d = new Utility_3D(); _3d.Initialize(Website.Config.ConversionLibarayLocation); Utility_3D.ConvertedModel model = null; Utility_3D.ConverterOptions cOptions = new Utility_3D.ConverterOptions(); cOptions.EnableTextureConversion(Utility_3D.ConverterOptions.PNG); cOptions.EnableScaleTextures(Website.Config.MaxTextureDimension); FileStatus status = (FileStatus)HttpContext.Current.Session["fileStatus"]; if (status == null) { HttpContext.Current.Response.StatusCode = 500; return(new FileStatus("error", "error")); } using (FileStream stream = new FileStream(HttpContext.Current.Server.MapPath("~/App_data/" + status.hashname), FileMode.Open)) { ContentObject tempFedoraObject = (ContentObject)HttpContext.Current.Session["contentObject"]; try //convert the model { model = pack.Convert(stream, status.hashname, cOptions); HttpContext.Current.Session["contentTextures"] = model.textureFiles; HttpContext.Current.Session["contentMissingTextures"] = model.missingTextures; Utility_3D.Parser.ModelData mdata = model._ModelData; tempFedoraObject.NumPolygons = mdata.VertexCount.Polys; tempFedoraObject.NumTextures = mdata.ReferencedTextures.Length; if (model._ModelData.VertexCount.Polys == 0 && model._ModelData.VertexCount.Verts == 0) { status.converted = "false"; status.type = FormatType.RECOGNIZED; } else { status.converted = "true"; status.type = FormatType.VIEWABLE; } HttpContext.Current.Session["fileStatus"] = status; tempFedoraObject.UpAxis = mdata.TransformProperties.UpAxis; if (mdata.TransformProperties.UnitMeters != 0) { tempFedoraObject.UnitScale = System.Convert.ToString(mdata.TransformProperties.UnitMeters); } else { tempFedoraObject.UnitScale = "1.0"; } HttpContext.Current.Session["contentObject"] = tempFedoraObject; //Save the O3D file for the viewer into a temporary directory var tempfile = HttpContext.Current.Server.MapPath("~/App_Data/viewerTemp/" + status.hashname).Replace(".skp", ".zip"); using (System.IO.FileStream savefile = new FileStream(tempfile, FileMode.Create)) { byte[] filedata = new Byte[model.data.Length]; model.data.CopyTo(filedata, 0); savefile.Write(model.data, 0, (int)model.data.Length); } ConvertFileToO3D(HttpContext.Current, tempfile); if (!File.Exists(HttpContext.Current.Server.MapPath("~/App_Data/viewerTemp/" + status.hashname).Replace(".skp", ".zip").Replace(".zip", ".o3d"))) { status.converted = "false"; status.type = FormatType.RECOGNIZED; } var rootDir = HttpContext.Current.Server.MapPath("~/App_Data/converterTemp/"); var fileName = Path.Combine(rootDir, status.hashname.Replace(".skp", ".zip")); if (!Directory.Exists(rootDir)) { Directory.CreateDirectory(rootDir); } if (File.Exists(fileName)) { File.Delete(fileName); } File.Move(tempfile, fileName); } catch (Exception e) //Error while converting { stream.Close(); //FileStatus.converted is set to false by default, no need to set status.msg = FileStatus.ConversionFailedMessage; //Add the conversion failed message deleteTempFile(status.hashname); HttpContext.Current.Session["fileStatus"] = null; //Reset the FileStatus for another upload attempt } } return(status); }
protected void Step1NextButton_Click(object sender, EventArgs e) { //update if (IsModelUpload) { vwarDAL.IDataRepository dal = (new vwarDAL.DataAccessFactory()).CreateDataRepositorProxy(); ; if (this.IsNew) { //create new & add to session ContentObject co = new ContentObject(dal); co.Title = this.TitleTextBox.Text.Trim(); co.UploadedDate = DateTime.Now; co.LastModified = DateTime.Now; co.Views = 0; co.SubmitterEmail = Context.User.Identity.Name.Trim(); dal.InsertContentObject(co); FedoraContentObject = co; this.ContentObjectID = co.PID; } else { FedoraContentObject.Title = TitleTextBox.Text.Trim(); } if (this.FedoraContentObject != null) { //asset type this.FedoraContentObject.AssetType = "Model"; string newFileName = TitleTextBox.Text.ToLower().Replace(' ', '_') + Path.GetExtension(this.ContentFileUpload.PostedFile.FileName); //model upload Utility_3D.ConvertedModel model = null; if (this.ContentFileUpload.HasFile) { string newOriginalFileName = "original_" + newFileName; if (IsNew) { using (MemoryStream stream = new MemoryStream()) { stream.Write(this.ContentFileUpload.FileBytes, 0, this.ContentFileUpload.FileBytes.Length); FedoraContentObject.OriginalFileId = dal.SetContentFile(stream, FedoraContentObject.PID, newOriginalFileName); } } else { //Update the original file dal.UpdateFile(this.ContentFileUpload.FileBytes, FedoraContentObject.PID, FedoraContentObject.OriginalFileName, newOriginalFileName); } FedoraContentObject.OriginalFileName = newOriginalFileName; Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D _3d = new Utility_3D(); Utility_3D.ConverterOptions cOptions = new Utility_3D.ConverterOptions(); cOptions.EnableTextureConversion(Utility_3D.ConverterOptions.PNG); cOptions.EnableScaleTextures(Website.Config.MaxTextureDimension); _3d.Initialize(Website.Config.ConversionLibarayLocation); string UploadedFilename = newFileName; if (Path.GetExtension(UploadedFilename) != ".zip") UploadedFilename = Path.ChangeExtension(newFileName, ".zip"); try { model = pack.Convert(this.ContentFileUpload.PostedFile.InputStream, this.ContentFileUpload.PostedFile.FileName, cOptions); } catch { Response.Redirect(Page.ResolveClientUrl("~/Public/Model.aspx?ContentObjectID=" + this.ContentObjectID)); } var displayFilePath = ""; string convertedFileName = newFileName.Replace(Path.GetExtension(newFileName).ToLower(), ".zip"); if (this.ContentFileUpload.HasFile) { using (Stream stream = new MemoryStream()) { stream.Write(model.data, 0, model.data.Length); stream.Seek(0, SeekOrigin.Begin); FedoraContentObject.Location = UploadedFilename; //FedoraContentObject.DisplayFileId = dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); } } else { using (MemoryStream stream = new MemoryStream()) { stream.Write(model.data, 0, model.data.Length); stream.Seek(0, SeekOrigin.Begin); dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); FedoraContentObject.Location = UploadedFilename; } } FedoraContentObject.Location = convertedFileName; if (model.type != "UNKNOWN") { string optionalPath = (newFileName.LastIndexOf("o3d", StringComparison.CurrentCultureIgnoreCase) != -1) ? "viewerTemp/" : "converterTemp/"; string pathToTempFile = "~/App_Data/" + optionalPath; string destPath = Path.Combine(Context.Server.MapPath(pathToTempFile), newFileName); System.IO.FileStream savefile = new FileStream(destPath, FileMode.OpenOrCreate); byte[] filedata = new Byte[model.data.Length]; model.data.CopyTo(filedata, 0); savefile.Write(model.data, 0, (int)model.data.Length); savefile.Close(); string outfilename = Context.Server.MapPath("~/App_Data/viewerTemp/") + newFileName.Replace(".zip", ".o3d"); string convertedtempfile = ConvertFileToO3D(destPath,outfilename); displayFilePath = FedoraContentObject.DisplayFile; string o3dFileName = newFileName.Replace(Path.GetExtension(newFileName).ToLower(), ".o3d"); if (this.ContentFileUpload.HasFile) { using (FileStream stream = new FileStream(convertedtempfile, FileMode.Open)) { FedoraContentObject.DisplayFileId = dal.SetContentFile(stream, FedoraContentObject, o3dFileName); } } else { using (MemoryStream stream = new MemoryStream()) { stream.Write(filedata, 0, filedata.Length); stream.Seek(0, SeekOrigin.Begin); dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); FedoraContentObject.DisplayFile = Path.GetFileName(FedoraContentObject.DisplayFile); } } FedoraContentObject.DisplayFile = o3dFileName; } else { FedoraContentObject.DisplayFile = string.Empty; } FedoraContentObject.UnitScale = model._ModelData.TransformProperties.UnitMeters.ToString(); FedoraContentObject.UpAxis = model._ModelData.TransformProperties.UpAxis; FedoraContentObject.NumPolygons = model._ModelData.VertexCount.Polys; FedoraContentObject.NumTextures = model._ModelData.ReferencedTextures.Length; PopulateValidationViewMetadata(FedoraContentObject); } //upload thumbnail if (this.ThumbnailFileUpload.HasFile) { int length = (int)this.ThumbnailFileUpload.PostedFile.InputStream.Length; if (IsNew || FedoraContentObject.ScreenShot == "")// order counts here have to set screenshot id after the update so we can find the correct dsid this.FedoraContentObject.ScreenShot = "screenshot.png"; FedoraContentObject.ScreenShotId = dal.SetContentFile(this.ThumbnailFileUpload.PostedFile.InputStream, this.FedoraContentObject, FedoraContentObject.ScreenShot); string ext = new FileInfo(ThumbnailFileUpload.PostedFile.FileName).Extension.ToLower(); System.Drawing.Imaging.ImageFormat format; if (ext == ".png") format = System.Drawing.Imaging.ImageFormat.Png; else if (ext == ".jpg") format = System.Drawing.Imaging.ImageFormat.Jpeg; else if (ext == ".gif") format = System.Drawing.Imaging.ImageFormat.Gif; else { ScreenshotValidator.Visible = true; ScreenshotValidator.Text = "Nice job generating a POST request without the interface. Don't you feel special?"; return; } //Avoid wasting space by removing old thumbnails if (!String.IsNullOrEmpty(FedoraContentObject.ThumbnailId)) File.Delete("~/thumbnails/" + FedoraContentObject.ThumbnailId); //Use the original file bytes to remain consistent with the new file upload ID creation for thumbnails FedoraContentObject.ThumbnailId = Website.Common.GetFileSHA1AndSalt(ThumbnailFileUpload.PostedFile.InputStream) + ext; using (FileStream outFile = new FileStream(HttpContext.Current.Server.MapPath("~/thumbnails/" + FedoraContentObject.ThumbnailId), FileMode.Create)) Website.Common.GenerateThumbnail(ThumbnailFileUpload.PostedFile.InputStream, outFile, format); } //creative commons license url if (this.CCLicenseDropDownList.SelectedItem != null && this.CCLicenseDropDownList.SelectedValue != "None") { this.FedoraContentObject.CreativeCommonsLicenseURL = this.CCLicenseDropDownList.SelectedValue.Trim(); } //Require Resubmit Checkbox FedoraContentObject.RequireResubmit = this.RequireResubmitCheckbox.Checked; //developer logo this.UploadDeveloperLogo(dal, this.FedoraContentObject); //developer name if (!string.IsNullOrEmpty(this.DeveloperNameTextBox.Text)) { this.FedoraContentObject.DeveloperName = this.DeveloperNameTextBox.Text.Trim(); } //sponsor logo this.UploadSponsorLogo(dal, this.FedoraContentObject); //sponsor name if (!string.IsNullOrEmpty(this.SponsorNameTextBox.Text)) { this.FedoraContentObject.SponsorName = this.SponsorNameTextBox.Text.Trim(); } //artist name if (!string.IsNullOrEmpty(this.ArtistNameTextBox.Text)) { this.FedoraContentObject.ArtistName = this.ArtistNameTextBox.Text.Trim(); } //format if (!string.IsNullOrEmpty(this.FormatTextBox.Text)) { this.FedoraContentObject.Format = this.FormatTextBox.Text.Trim(); } //description if (!string.IsNullOrEmpty(this.DescriptionTextBox.Text)) { this.FedoraContentObject.Description = this.DescriptionTextBox.Text.Trim(); } //more information url if (!string.IsNullOrEmpty(this.MoreInformationURLTextBox.Text)) { this.FedoraContentObject.MoreInformationURL = this.MoreInformationURLTextBox.Text.Trim(); } //keywords string cleanTags = ""; foreach (string s in KeywordsTextBox.Text.Split(',')) { cleanTags += s.Trim() + ","; } cleanTags = HttpContext.Current.Server.HtmlEncode(cleanTags.Trim(',')); this.FedoraContentObject.Keywords = cleanTags; } dal.UpdateContentObject(FedoraContentObject); if (IsNew) { PermissionsManager perm = new PermissionsManager(); perm.SetModelToGroupLevel(System.Configuration.ConfigurationManager.AppSettings["DefaultAdminName"], FedoraContentObject.PID, vwarDAL.DefaultGroups.AllUsers, ModelPermissionLevel.Fetchable); perm.SetModelToGroupLevel(System.Configuration.ConfigurationManager.AppSettings["DefaultAdminName"], FedoraContentObject.PID, vwarDAL.DefaultGroups.AnonymousUsers, ModelPermissionLevel.Searchable); perm.Dispose(); } SetModelDisplay(); this.PopulateValidationViewMetadata(FedoraContentObject); this.MultiView1.SetActiveView(this.ValidationView); var admins = UserProfileDB.GetAllAdministrativeUsers(); foreach (DataRow row in admins.Rows) { var url = Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, this.ResolveUrl(Website.Pages.Types.FormatModel(this.ContentObjectID))); Website.Mail.SendModelUploaded(FedoraContentObject); } dal.Dispose(); } }
protected void Step1NextButton_Click(object sender, EventArgs e) { //update if (IsModelUpload) { vwarDAL.IDataRepository dal = (new vwarDAL.DataAccessFactory()).CreateDataRepositorProxy();; if (this.IsNew) { //create new & add to session ContentObject co = new ContentObject(dal); co.Title = this.TitleTextBox.Text.Trim(); co.UploadedDate = DateTime.Now; co.LastModified = DateTime.Now; co.Views = 0; co.SubmitterEmail = Context.User.Identity.Name.Trim(); dal.InsertContentObject(co); FedoraContentObject = co; this.ContentObjectID = co.PID; } else { FedoraContentObject.Title = TitleTextBox.Text.Trim(); } if (this.FedoraContentObject != null) { //asset type this.FedoraContentObject.AssetType = "Model"; string newFileName = TitleTextBox.Text.ToLower().Replace(' ', '_') + Path.GetExtension(this.ContentFileUpload.PostedFile.FileName); //model upload Utility_3D.ConvertedModel model = null; if (this.ContentFileUpload.HasFile) { string newOriginalFileName = "original_" + newFileName; if (IsNew) { using (MemoryStream stream = new MemoryStream()) { stream.Write(this.ContentFileUpload.FileBytes, 0, this.ContentFileUpload.FileBytes.Length); FedoraContentObject.OriginalFileId = dal.SetContentFile(stream, FedoraContentObject.PID, newOriginalFileName); } } else { //Update the original file dal.UpdateFile(this.ContentFileUpload.FileBytes, FedoraContentObject.PID, FedoraContentObject.OriginalFileName, newOriginalFileName); } FedoraContentObject.OriginalFileName = newOriginalFileName; Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D _3d = new Utility_3D(); Utility_3D.ConverterOptions cOptions = new Utility_3D.ConverterOptions(); cOptions.EnableTextureConversion(Utility_3D.ConverterOptions.PNG); cOptions.EnableScaleTextures(Website.Config.MaxTextureDimension); _3d.Initialize(Website.Config.ConversionLibarayLocation); string UploadedFilename = newFileName; if (Path.GetExtension(UploadedFilename) != ".zip") { UploadedFilename = Path.ChangeExtension(newFileName, ".zip"); } try { model = pack.Convert(this.ContentFileUpload.PostedFile.InputStream, this.ContentFileUpload.PostedFile.FileName, cOptions); } catch { Response.Redirect(Page.ResolveClientUrl("~/Public/Model.aspx?ContentObjectID=" + this.ContentObjectID)); } var displayFilePath = ""; string convertedFileName = newFileName.Replace(Path.GetExtension(newFileName).ToLower(), ".zip"); if (this.ContentFileUpload.HasFile) { using (Stream stream = new MemoryStream()) { stream.Write(model.data, 0, model.data.Length); stream.Seek(0, SeekOrigin.Begin); FedoraContentObject.Location = UploadedFilename; //FedoraContentObject.DisplayFileId = dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); } } else { using (MemoryStream stream = new MemoryStream()) { stream.Write(model.data, 0, model.data.Length); stream.Seek(0, SeekOrigin.Begin); dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); FedoraContentObject.Location = UploadedFilename; } } FedoraContentObject.Location = convertedFileName; if (model.type != "UNKNOWN") { string optionalPath = (newFileName.LastIndexOf("o3d", StringComparison.CurrentCultureIgnoreCase) != -1) ? "viewerTemp/" : "converterTemp/"; string pathToTempFile = "~/App_Data/" + optionalPath; string destPath = Path.Combine(Context.Server.MapPath(pathToTempFile), newFileName); System.IO.FileStream savefile = new FileStream(destPath, FileMode.OpenOrCreate); byte[] filedata = new Byte[model.data.Length]; model.data.CopyTo(filedata, 0); savefile.Write(model.data, 0, (int)model.data.Length); savefile.Close(); string outfilename = Context.Server.MapPath("~/App_Data/viewerTemp/") + newFileName.Replace(".zip", ".o3d"); string convertedtempfile = ConvertFileToO3D(destPath, outfilename); displayFilePath = FedoraContentObject.DisplayFile; string o3dFileName = newFileName.Replace(Path.GetExtension(newFileName).ToLower(), ".o3d"); if (this.ContentFileUpload.HasFile) { using (FileStream stream = new FileStream(convertedtempfile, FileMode.Open)) { FedoraContentObject.DisplayFileId = dal.SetContentFile(stream, FedoraContentObject, o3dFileName); } } else { using (MemoryStream stream = new MemoryStream()) { stream.Write(filedata, 0, filedata.Length); stream.Seek(0, SeekOrigin.Begin); dal.SetContentFile(stream, FedoraContentObject, UploadedFilename); FedoraContentObject.DisplayFile = Path.GetFileName(FedoraContentObject.DisplayFile); } } FedoraContentObject.DisplayFile = o3dFileName; } else { FedoraContentObject.DisplayFile = string.Empty; } FedoraContentObject.UnitScale = model._ModelData.TransformProperties.UnitMeters.ToString(); FedoraContentObject.UpAxis = model._ModelData.TransformProperties.UpAxis; FedoraContentObject.NumPolygons = model._ModelData.VertexCount.Polys; FedoraContentObject.NumTextures = model._ModelData.ReferencedTextures.Length; PopulateValidationViewMetadata(FedoraContentObject); } //upload thumbnail if (this.ThumbnailFileUpload.HasFile) { int length = (int)this.ThumbnailFileUpload.PostedFile.InputStream.Length; if (IsNew || FedoraContentObject.ScreenShot == "")// order counts here have to set screenshot id after the update so we can find the correct dsid { this.FedoraContentObject.ScreenShot = "screenshot.png"; } FedoraContentObject.ScreenShotId = dal.SetContentFile(this.ThumbnailFileUpload.PostedFile.InputStream, this.FedoraContentObject, FedoraContentObject.ScreenShot); string ext = new FileInfo(ThumbnailFileUpload.PostedFile.FileName).Extension.ToLower(); System.Drawing.Imaging.ImageFormat format; if (ext == ".png") { format = System.Drawing.Imaging.ImageFormat.Png; } else if (ext == ".jpg") { format = System.Drawing.Imaging.ImageFormat.Jpeg; } else if (ext == ".gif") { format = System.Drawing.Imaging.ImageFormat.Gif; } else { ScreenshotValidator.Visible = true; ScreenshotValidator.Text = "Nice job generating a POST request without the interface. Don't you feel special?"; return; } //Avoid wasting space by removing old thumbnails //if (!String.IsNullOrEmpty(FedoraContentObject.ThumbnailId)) // File.Delete("~/thumbnails/" + FedoraContentObject.ThumbnailId); //Use the original file bytes to remain consistent with the new file upload ID creation for thumbnails FedoraContentObject.ThumbnailId = Website.Common.GetFileSHA1AndSalt(ThumbnailFileUpload.PostedFile.InputStream) + ext; //using (FileStream outFile = new FileStream(HttpContext.Current.Server.MapPath("~/thumbnails/" + FedoraContentObject.ThumbnailId), FileMode.Create)) // Website.Common.GenerateThumbnail(ThumbnailFileUpload.PostedFile.InputStream, outFile, format); } //creative commons license url if (this.CCLicenseDropDownList.SelectedItem != null && this.CCLicenseDropDownList.SelectedValue != "None") { this.FedoraContentObject.CreativeCommonsLicenseURL = this.CCLicenseDropDownList.SelectedValue.Trim(); } //Require Resubmit Checkbox FedoraContentObject.RequireResubmit = this.RequireResubmitCheckbox.Checked; //developer logo this.UploadDeveloperLogo(dal, this.FedoraContentObject); //developer name if (!string.IsNullOrEmpty(this.DeveloperNameTextBox.Text)) { this.FedoraContentObject.DeveloperName = this.DeveloperNameTextBox.Text.Trim(); } //sponsor logo this.UploadSponsorLogo(dal, this.FedoraContentObject); //sponsor name if (!string.IsNullOrEmpty(this.SponsorNameTextBox.Text)) { this.FedoraContentObject.SponsorName = this.SponsorNameTextBox.Text.Trim(); } //artist name if (!string.IsNullOrEmpty(this.ArtistNameTextBox.Text)) { this.FedoraContentObject.ArtistName = this.ArtistNameTextBox.Text.Trim(); } //format if (!string.IsNullOrEmpty(this.FormatTextBox.Text)) { this.FedoraContentObject.Format = this.FormatTextBox.Text.Trim(); } //description if (!string.IsNullOrEmpty(this.DescriptionTextBox.Text)) { this.FedoraContentObject.Description = this.DescriptionTextBox.Text.Trim(); } //more information url if (!string.IsNullOrEmpty(this.MoreInformationURLTextBox.Text)) { this.FedoraContentObject.MoreInformationURL = this.MoreInformationURLTextBox.Text.Trim(); } //keywords string cleanTags = ""; foreach (string s in KeywordsTextBox.Text.Split(',')) { cleanTags += s.Trim() + ","; } cleanTags = HttpContext.Current.Server.HtmlEncode(cleanTags.Trim(',')); this.FedoraContentObject.Keywords = cleanTags; } dal.UpdateContentObject(FedoraContentObject); if (IsNew) { PermissionsManager perm = new PermissionsManager(); perm.SetModelToGroupLevel(System.Configuration.ConfigurationManager.AppSettings["DefaultAdminName"], FedoraContentObject.PID, vwarDAL.DefaultGroups.AllUsers, ModelPermissionLevel.Fetchable); perm.SetModelToGroupLevel(System.Configuration.ConfigurationManager.AppSettings["DefaultAdminName"], FedoraContentObject.PID, vwarDAL.DefaultGroups.AnonymousUsers, ModelPermissionLevel.Searchable); perm.Dispose(); } SetModelDisplay(); this.PopulateValidationViewMetadata(FedoraContentObject); this.MultiView1.SetActiveView(this.ValidationView); var admins = UserProfileDB.GetAllAdministrativeUsers(); foreach (DataRow row in admins.Rows) { var url = Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, this.ResolveUrl(Website.Pages.Types.FormatModel(this.ContentObjectID))); Website.Mail.SendModelUploaded(FedoraContentObject); } dal.Dispose(); } }
public static FileStatus Convert() { Utility_3D.Model_Packager pack = new Utility_3D.Model_Packager(); Utility_3D _3d = new Utility_3D(); _3d.Initialize(Website.Config.ConversionLibarayLocation); Utility_3D.ConvertedModel model = null; Utility_3D.ConverterOptions cOptions = new Utility_3D.ConverterOptions(); cOptions.EnableTextureConversion(Utility_3D.ConverterOptions.PNG); cOptions.EnableScaleTextures(Website.Config.MaxTextureDimension); FileStatus status = (FileStatus)HttpContext.Current.Session["fileStatus"]; if (status == null) { HttpContext.Current.Response.StatusCode = 500; return new FileStatus("error", "error"); } using (FileStream stream = new FileStream(HttpContext.Current.Server.MapPath("~/App_data/" + status.hashname), FileMode.Open)) { ContentObject tempFedoraObject = (ContentObject)HttpContext.Current.Session["contentObject"]; try //convert the model { model = pack.Convert(stream, status.hashname, cOptions); HttpContext.Current.Session["contentTextures"] = model.textureFiles; HttpContext.Current.Session["contentMissingTextures"] = model.missingTextures; Utility_3D.Parser.ModelData mdata = model._ModelData; tempFedoraObject.NumPolygons = mdata.VertexCount.Polys; tempFedoraObject.NumTextures = mdata.ReferencedTextures.Length; if (model._ModelData.VertexCount.Polys == 0 && model._ModelData.VertexCount.Verts == 0) { status.converted = "false"; status.type = FormatType.RECOGNIZED; } else { status.converted = "true"; status.type = FormatType.VIEWABLE; } HttpContext.Current.Session["fileStatus"] = status; tempFedoraObject.UpAxis = mdata.TransformProperties.UpAxis; if (mdata.TransformProperties.UnitMeters != 0) { tempFedoraObject.UnitScale = System.Convert.ToString(mdata.TransformProperties.UnitMeters); } else { tempFedoraObject.UnitScale = "1.0"; } HttpContext.Current.Session["contentObject"] = tempFedoraObject; //Save the O3D file for the viewer into a temporary directory var tempfile = HttpContext.Current.Server.MapPath("~/App_Data/viewerTemp/" + status.hashname).Replace(".skp", ".zip"); using (System.IO.FileStream savefile = new FileStream(tempfile, FileMode.Create)) { byte[] filedata = new Byte[model.data.Length]; model.data.CopyTo(filedata, 0); savefile.Write(model.data, 0, (int)model.data.Length); } ConvertFileToO3D(HttpContext.Current, tempfile); if (!File.Exists(HttpContext.Current.Server.MapPath("~/App_Data/viewerTemp/" + status.hashname).Replace(".skp", ".zip").Replace(".zip", ".o3d"))) { status.converted = "false"; status.type = FormatType.RECOGNIZED; } var rootDir = HttpContext.Current.Server.MapPath("~/App_Data/converterTemp/"); var fileName = Path.Combine(rootDir, status.hashname.Replace(".skp", ".zip")); if (!Directory.Exists(rootDir)) { Directory.CreateDirectory(rootDir); } if (File.Exists(fileName)) { File.Delete(fileName); } File.Move(tempfile, fileName); } catch (Exception e) //Error while converting { stream.Close(); //FileStatus.converted is set to false by default, no need to set status.msg = FileStatus.ConversionFailedMessage; //Add the conversion failed message deleteTempFile(status.hashname); HttpContext.Current.Session["fileStatus"] = null; //Reset the FileStatus for another upload attempt } } return status; }
//Get the content for a model public Stream GetModel(string pid, string format, string options, string key) { SetCorsHeaders(); if (!CheckKey(key)) return null; pid = pid.Replace('_', ':'); //Get the content object vwarDAL.ContentObject co = GetRepo().GetContentObjectById(pid, false); //Check permissions if (!DoValidate(Security.TransactionType.Access, pid)) { ReleaseRepo(); return null; } if (options == "uncompressed") { //check the cache! byte[] uncompresseddata = null; if (format == "dae") uncompresseddata = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.DAE)); if (format == "fbx") uncompresseddata = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.FBX)); if (format == "3ds") uncompresseddata = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE._3DS)); if (format == "obj") uncompresseddata = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.OBJ)); if (format == "json") uncompresseddata = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.JSON)); MemoryStream ms2 = null; if (uncompresseddata != null) { ms2 = new MemoryStream(uncompresseddata); SetResponseHeaders(GetMimeType("" + format + "." + format), (int)ms2.Length, "attachment; filename=" + co.Title + "." + format); ReleaseRepo(); return ms2; } } //check the cache! byte[] data = null; if (format == "dae") data = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedDAE)); if (format == "fbx") data = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedFBX)); if (format == "3ds") data = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.Compressed3DS)); if (format == "obj") data = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedOBJ)); if (format == "json") data = CacheManager.CheckCache<byte[]>(new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedJSON)); MemoryStream ms = null; if (data != null) { ms = new MemoryStream(data); SetResponseHeaders(GetMimeType("" + format + "." + "zip"), (int)ms.Length, "attachment; filename=" + co.Title + "_" + format + "." + "zip"); ReleaseRepo(); } else { //Check that this content object actually has a content file if (co.Location != "") { //If they want the dae file, they can get just the contnet file if (format.ToLower() == "dae" || format.ToLower() == "collada") { ms = (MemoryStream)co.GetContentFile(); SetResponseHeaders(GetMimeType(co.Location), (int)ms.Length, "attachment; filename=" + co.Location); //return ms as Stream; } //note that if the options string is anything, then the cached display file is not the one the client needs else if ((format.ToLower() == "o3d" || format.ToLower() == "o3dtgz") && options == "") { ms = (MemoryStream)GetRepo().GetCachedContentObjectTransform(co, "o3d"); SetResponseHeaders(GetMimeType(co.DisplayFile), (int)ms.Length, "attachment; filename=" + co.DisplayFile); //no point following on to try to uncompress this - it's already uncompressed ReleaseRepo(); return ms as Stream; } //If they want any type other than the ones above, do the conversion else { //Get the base content file Stream unconvertedData = co.GetContentFile(); //setup the conversion system Utility_3D _3d = new Utility_3D(); _3d.Initialize(ConfigurationManager.AppSettings["LibraryLocation"]); Utility_3D.Model_Packager converter = new Utility_3D.Model_Packager(); Utility_3D.ConverterOptions opts = new Utility_3D.ConverterOptions(); //No need to gather metadata during this conversion, which slows down the conversion significantly //opts.DisableMetadataGathering(); //Try to convert the model to the requested format Utility_3D.ConvertedModel model; try { model = converter.Convert(unconvertedData, co.Location, format, opts); } catch (Utility_3D.ConversionException e) { throw new System.Net.WebException(e.what()); } //Looks like the conversion worked. SetResponseHeaders(GetMimeType(co.DisplayFile + "." + format), (int)model.data.Length, "attachment; filename=" + co.Location); //Return the new data ms = new MemoryStream(model.data); if (format == "dae") CacheManager.Cache<byte[]>(ref model.data, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedDAE)); if (format == "fbx") CacheManager.Cache<byte[]>(ref model.data, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedFBX)); if (format == "3ds") CacheManager.Cache<byte[]>(ref model.data, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.Compressed3DS)); if (format == "obj") CacheManager.Cache<byte[]>(ref model.data, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedOBJ)); if (format == "json") CacheManager.Cache<byte[]>(ref model.data, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.CompressedJSON)); //return ms as Stream; GetRepo().IncrementDownloads(co.PID); ReleaseRepo(); } } } // if (options == "uncompressed") { ms.Seek(0, SeekOrigin.Begin); Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(ms); foreach (Ionic.Zip.ZipEntry ze in zip) { if ("." + format == (Path.GetExtension(ze.FileName.ToLower()))) { MemoryStream model = new MemoryStream(); ze.Extract(model); //Cache it! byte[] tocache = new byte[model.Length]; model.Seek(0, SeekOrigin.Begin); model.Read(tocache, 0, (int)model.Length); model.Seek(0, SeekOrigin.Begin); if (format == "dae") CacheManager.Cache<byte[]>(ref tocache, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.DAE)); if (format == "fbx") CacheManager.Cache<byte[]>(ref tocache, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.FBX)); if (format == "3ds") CacheManager.Cache<byte[]>(ref tocache, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE._3DS)); if (format == "obj") CacheManager.Cache<byte[]>(ref tocache, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.OBJ)); if (format == "json") CacheManager.Cache<byte[]>(ref tocache, new CacheIdentifier(pid, "", CacheIdentifier.FILETYPE.JSON)); SetResponseHeaders(GetMimeType(ze.FileName.ToLower()), (int)model.Length, "attachment; filename=" + ze.FileName.ToLower()); model.Seek(0, SeekOrigin.Begin); ReleaseRepo(); return model as Stream; } } } //There is no content for this content object return ms; }
//Upload a new content object. Returns the pid of the uploaded file public string UploadFile(byte[] data, string pid, string key) { if (!CheckKey(key)) return null; //Check permissions if (!DoValidate(Security.TransactionType.Create, null)) return "Not authorized"; vwarDAL.ContentObject co = null; //Create a new object if (pid == "") { co = GetRepo().GetNewContentObject(); co.Revision = 0; //Setup some default values co.Title = "tempupload"; co.Views = 0; } if (pid != "") { co = GetRepo().GetContentObjectById(pid, false); if (co == null) { ReleaseRepo(); return "PID does not exist"; } co.Revision = co.Revision + 1; } co.UploadedDate = DateTime.Now; co.LastModified = DateTime.Now; //The owner of this content is the person whose credentials were used to upload it co.SubmitterEmail = GetUserEmail(); Utility_3D.ConvertedModel model; try { //Setup the conversion library Utility_3D _3d = new Utility_3D(); _3d.Initialize(ConfigurationManager.AppSettings["LibraryLocation"]); Utility_3D.Model_Packager converter = new Utility_3D.Model_Packager(); Utility_3D.ConverterOptions opts = new Utility_3D.ConverterOptions(); //We do want metadata gathered with this conversion opts.EnableMetadataGathering(); opts.EnableScaleTextures(512); opts.EnableTextureConversion("png"); //Try to convert the model package into a dae //Note that the system might allow you to input an skp, so this should probably take a filename //The conversion needs to be told that the input is skp, and currently it's hardcoded to show it as a zip model = converter.Convert(new MemoryStream(data), "content.zip", "dae", opts); } catch (Utility_3D.ConversionException e) { model = null; } catch (System.Exception e) { model = null; } if (model != null) { //Copy the data gathered by the converter to the metadata co.NumPolygons = model._ModelData.VertexCount.Polys; co.NumTextures = model.textureFiles.Count; co.UpAxis = model._ModelData.TransformProperties.UpAxis; co.UnitScale = model._ModelData.TransformProperties.UnitMeters.ToString(); co.LastModified = System.DateTime.Now; co.Views = 0; } co.UploadedDate = System.DateTime.Now; //Place this new object in the repo if (pid != "") { GetRepo().InsertContentRevision(co); } else { GetRepo().InsertContentObject(co); } if (model != null) { //Set the stream from the conversion to the content of this object co.SetContentFile(new MemoryStream(model.data), "content.zip"); //Set the display file Stream displayfile = ConvertFileToO3D(new MemoryStream(model.data)); if (displayfile != null) co.SetDisplayFile(displayfile, "content.o3d"); //Add the references to textrues discovered by the converter to the database foreach (string i in model._ModelData.ReferencedTextures) co.AddTextureReference(i.ToLower(), "Diffuse", 0); //Add the references to missing textures to the database foreach (string i in model.missingTextures) co.AddMissingTexture(i.ToLower(), "Diffuse", 0); } //set the original file data co.OriginalFileName = "OriginalUpload.zip"; co.OriginalFileId = GetRepo().SetContentFile(new MemoryStream(data), co.PID, co.OriginalFileName); co.CommitChanges(); //setup the default permissions vwarDAL.PermissionsManager perm = new vwarDAL.PermissionsManager(); perm.SetModelToGroupLevel(GetUserEmail(), co.PID, vwarDAL.DefaultGroups.AllUsers, vwarDAL.ModelPermissionLevel.Fetchable); perm.SetModelToGroupLevel(GetUserEmail(), co.PID, vwarDAL.DefaultGroups.AnonymousUsers, vwarDAL.ModelPermissionLevel.Searchable); perm.Dispose(); ReleaseRepo(); //return the pid of this new object return co.PID; }