Uploading files
If you upload files I strongly recommend that you don't store them in the web root folder. Nothing should be added or changed in the web folder between two deploys.
There are some ways hat you can store files, for example using NAS or some technique that would mirror folders and files between servers.
The most simplest way I would say is to create a folder on a separate file server or on one of your load balanced servers.
Make this folder accessible on your network as a shared folder, for example \\servername\webfiles and make sure that the user running the IIS application pools have access to these.
When it comes to displaying these images you could either create a proxy that reads the image from the file share and outputs it to the response stream to the visitor, or try with a Virtual Folder in your IIS website. Deciding with option would be based on how you manage uploaded images.
Files as content
If you create a ContentFolder as a child under ContentReference.RootPage, they won't be visible in the media tab of the Asset Pane.
Thanks for your answer Alf!
I choosed to store the files in the repository but as you suggested I stored them under a page instead of in global assets. This works pretty good except when I use the Delete method on the repository to delete an image content, then I get an exception that the content does not extend the PageData class. Using the MoveToWastebasket however works fine, but I would prefer to use the Delete method.
I think it works better if you programmatically creates a content folder under the root page and creates your files as children to that folder. Could that help?
No, still the same error.
This is what I did (The "ProfileImages" folder is created in an initialization module):
...
var imageFolder = contentRepository.GetChildren<ContentFolder>(ContentReference.RootPage).FirstOrDefault(c => c.Name.Equals("ProfileImages")); if (imageFolder != null) { var file = contentRepository.GetDefault<ImageFile>(imageFolder.ContentLink); file.Name = profile.User + Guid.NewGuid()+ Path.GetExtension(image.FileName); var blob = blobFactory.CreateBlob(file.BinaryDataContainer, Path.GetExtension(image.FileName)); blob.Write(image.InputStream); file.BinaryData = blob; profile.ImageContentReference = contentRepository.Save(file, SaveAction.Publish, AccessLevel.NoAccess); }
Later on the following Delete fails with the this exception message {"Content with id '3536' is of type 'Castle.Proxies.ImageFileProxy' which does not inherit required type 'EPiServer.Core.PageData'"}
contentRepository.Delete(new ContentReference(profile.ImageContentReference),true,AccessLevel.NoAccess);
Weird. Could you give more details from the callstack?
Also I don't think it's necesarry that you do new ContentReference(profile.ImageContentReference) if ImageContentReference already is a ContentReference.
Guess that would not solve your problem but give a simpler code :)
The "new ContentReference" was a typo, sorry about that.
I also found the problem, there was an eventlistener that I was unaware of which was causing the issue.
Thanks for your help!!
Hi!
I'm working on an episerver site where visitors can create personal profiles. They can also upload personal image files that will be displayed on their profile page. I'm not sure where the best place to store these files are? If I store them in a folder under the site, how can that folder be shared between the different deployments in a load balanced environment? I don't want to store them as media in the content repository because I don't want them to be accessible in the file manager, or can they be hidden?