Now that V7 has a nice drag and drop UI for uploading media, life is better and I was hoping to leave behind the Desktop Media Uploader once and for all... however I don't think I can.
The scenario:
A folder in the media section contains a large amount of PDFs
The PDFs are updated every month and a strict naming convention is maintained
There are links to the various PDFs scattered throughout the site
Links to the PDFs are progarmatically created and also created in the RTE
The issue:
Historyically (V4.xx) the task of updating the PDFs was a monthly drag and drop of all the files into the Desktop Media Uploader - ***with the: "Overwrite existing files with the same filename?" checkbox checked. This works fine - assuming you check the box. Otherwise you have to log into the media section and torch all the duplicate files and do it all over again.
In V7
When you click on a folder in the media section, the UI allows you to drag and drop files for uploading - which is great for new files. The problem is that it automatically makes a choice to not overwrite existing files and instead it dynamically appends a number to the end of the file name to make it unique and issues a new media node Id. It doesn't ever ask if that's what I wanted to do.
Why is this the default behaviour?
Why is this the only behaviour?
I question the assumption that this is the correct approach. It certainly seems counter-intuitive as I believe overwriting files is a standard thing everybody does - if you upload a file wth the same file name - what do you expect?
Can this behaviour be changed?
Is there (or can there be) a configuration toggle that says ALWAYS OVERWRITE MEDIA: TRUE/FALSE?
Is there some other solution to this issue?
Everytime I launch the Desktop Media Uploader I'm prompted by Adobe to download some patch or something. It's time to put that tired soldier to bed and keep everything in the browser.
Client has a high ranking PDF in Google search results as a media URL.
Tried to update it only to find the link in the results goes to the old document URL which is no longer valid.
It was totally non-obvious to them that choosing a new file after selecting the old media file media and uploading/saving would not overwrite the existing PDF. And that it would then delete the old one when creating the new media ID.
Surely if uploading a new file over an existing one Umbraco should either:
Overwrite the old one updating the size/thumbnail but not the name/ID (my preferred option)
or
It should create a new media item with all the new details and change all the media item links to point to the new id. Preserving the old one. Which is almost what happens currently.
This is a source of many calls and confusion. The media section, while so much better in 7+ still needs some some attention to detail IMO. I would love to see:
Overwrite promps - if you are inside a media item to begin with, why would you want anything else than overwrite existing? If you wanted to delete the item, then delete the media node...
Get rid of "Remove files." Totally confusing. In my mind, it should be: send a media node to the recyle bin to pull it out of circulation, then clear the recycle bin and PERMANENTLY delete the node and delete the media folder off of the filesystem - no orphans! I have a client with 8 gigs of orphaned media and we are all too scared to delete them via FALM.
inside media item - choose files should upload media into that media id regardless of whether or not it has the same file name, if we wanted to upload media with a different id, it follows that you would just create a new media item through the regular channels.
Use an id to reference media instead of a file path within the RTE in the same way that you do with files to prevent the possibility of orphaning...
At the very least some better text/instructions within.
Thank-you Umbraco team and keep up the amazing work.
What about this solution?
I just hooked into the saving-event of a media file, checking if the file in this folder already exists and if so, just replace it instead of counting it up.
(with this file, you always overwrite an existing file with a new one - there will be no choice!)
Just copy this code into a file e.g. overwriteMediaFiles.cs and place it in your App_Code Folder or include it in your own binary-file of you web-project:
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Services;
namespace umbHbiG.Klassen
{
public class OverrideExistingMediaFile : IApplicationEventHandler
{
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
MediaService.Saving += MediaService_Saving;
}
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
private void MediaService_Saving(IMediaService sender, Umbraco.Core.Events.SaveEventArgs<Umbraco.Core.Models.IMedia> e)
{
foreach (IMedia node in e.SavedEntities)
{
if (node.ContentType.Alias != "Folder") // IF FILE OR IMAGE
{
if (node.Id == 0) // IF NEW
{
IMediaService ms = ApplicationContext.Current.Services.MediaService;
List<IMedia> media = getMediaByFileName(node.Name); // GET ALLE MEDIA FILES, INCLUDING THE FILENAME UPLOADED
if (media.Count > 0)
{
bool overwriteFound = false;
foreach (IMedia m in media)
{
// OVERWRITE FILE IF PARANT ID IS THE SAME
if (m.ParentId == node.ParentId)
{
m.SetValue(Constants.Conventions.Media.File, node.GetValue(Constants.Conventions.Media.File));
ms.Save(m, 0, false);
overwriteFound = true;
}
}
if (overwriteFound)
{
e.Cancel = true; // CANCEL THE COMMON UPLOAD EVENT
EventMessage cancelMessage = new EventMessage("Media Upload", "File has been overridden successfully", EventMessageType.Success);
e.CancelOperation(cancelMessage);
}
}
}
}
}
}
// SELECT MEDIA ENTRIES THAT ENDS WITH THE GIVEN FILENAME
private List<IMedia> getMediaByFileName(string filename)
{
List<IMedia> media = new List<IMedia>();
// CAN BE MADE SAVER AGAINST SQL INJECTIONS
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["umbracoDbDSN"].ConnectionString;
string sqlSelect = "SELECT nodeId FROM cmsMedia WHERE mediaPath LIKE \'%" + filename + "\'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
//
using (SqlCommand command = new SqlCommand(
sqlSelect,
connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
string strNodeId = reader.GetValue(0).ToString();
int nodeId = Convert.ToInt32(strNodeId);
IMediaService ms = ApplicationContext.Current.Services.MediaService;
IMedia m = ms.GetById(nodeId);
media.Add(m);
}
}
}
}
return media;
}
}
}
Thomas - thanks for this great bit of code. I will test implement and let you know how it works out in my scenario. Thanks for the lead into hooking into the events. I might write up some delete file behavior for when a media item is removed from the recycle bin. I Just had another client last week using 7.6.4 confused as hell about how to physically remove a file of the filesystem after they thought they were permanently removing media items. I have yet to test if these functionality now exists in later versions.
you are welcome. Hope it helps with your scenario.
I just had a delete-issue with media files today.
We removed an image, also deleted the physical media-path.
BUT: be aware of the imageProcessor-Cache.
So, we had the case, that the image cannot be called with the normal URL:
e.g. "/media/12345/picname.jpg".
BUT still be reachable, if you use it with an imageprocessor-Querystring:
"/media/12345/picname.jpg?autorotate=true".
This is a serious problem, cause we had an copy-right issue and was forced by a laywer to remove the image.
We removed it in the believe, it is really removed, even checked the url (but without thinking of the image processor).
And this get us in kind of trouble, as you can imagine.
So if you want to delete an image, be aware of the image-processor caching. :)
Always overwrite media
Now that V7 has a nice drag and drop UI for uploading media, life is better and I was hoping to leave behind the Desktop Media Uploader once and for all... however I don't think I can.
The scenario:
The issue:
Historyically (V4.xx) the task of updating the PDFs was a monthly drag and drop of all the files into the Desktop Media Uploader - ***with the: "Overwrite existing files with the same filename?" checkbox checked. This works fine - assuming you check the box. Otherwise you have to log into the media section and torch all the duplicate files and do it all over again.
In V7
When you click on a folder in the media section, the UI allows you to drag and drop files for uploading - which is great for new files. The problem is that it automatically makes a choice to not overwrite existing files and instead it dynamically appends a number to the end of the file name to make it unique and issues a new media node Id. It doesn't ever ask if that's what I wanted to do.
Why is this the default behaviour?
Why is this the only behaviour?
I question the assumption that this is the correct approach. It certainly seems counter-intuitive as I believe overwriting files is a standard thing everybody does - if you upload a file wth the same file name - what do you expect?
Can this behaviour be changed?
Is there (or can there be) a configuration toggle that says ALWAYS OVERWRITE MEDIA: TRUE/FALSE?
Is there some other solution to this issue?
Everytime I launch the Desktop Media Uploader I'm prompted by Adobe to download some patch or something. It's time to put that tired soldier to bed and keep everything in the browser.
What says you HQ?
thanks in advance...
Just been bitten by this.
Client has a high ranking PDF in Google search results as a media URL.
Tried to update it only to find the link in the results goes to the old document URL which is no longer valid.
It was totally non-obvious to them that choosing a new file after selecting the old media file media and uploading/saving would not overwrite the existing PDF. And that it would then delete the old one when creating the new media ID.
Surely if uploading a new file over an existing one Umbraco should either:
Overwrite the old one updating the size/thumbnail but not the name/ID (my preferred option) or It should create a new media item with all the new details and change all the media item links to point to the new id. Preserving the old one. Which is almost what happens currently.
In any case the user should be warned.
This definitely needs to be updated. Perform the same operation that would occur on any OS -> prompt for confirmation to replace or keep.
Bumpity bump bump with extra bump on top
CodeGarden 2016 is on as I write this. Will there be a grand reveal of a rethink of media in umbraco that will fix this issue. One can only hope.
Please give this topic some consideration HQ.
Many thanks
This is a source of many calls and confusion. The media section, while so much better in 7+ still needs some some attention to detail IMO. I would love to see:
Overwrite promps - if you are inside a media item to begin with, why would you want anything else than overwrite existing? If you wanted to delete the item, then delete the media node...
Get rid of "Remove files." Totally confusing. In my mind, it should be: send a media node to the recyle bin to pull it out of circulation, then clear the recycle bin and PERMANENTLY delete the node and delete the media folder off of the filesystem - no orphans! I have a client with 8 gigs of orphaned media and we are all too scared to delete them via FALM.
inside media item - choose files should upload media into that media id regardless of whether or not it has the same file name, if we wanted to upload media with a different id, it follows that you would just create a new media item through the regular channels.
Use an id to reference media instead of a file path within the RTE in the same way that you do with files to prevent the possibility of orphaning...
At the very least some better text/instructions within.
Thank-you Umbraco team and keep up the amazing work.
Jamie
It is now 2018 and I still think these issues remain.
:(
Does anyone have any solution to bulk updating of files?
What about this solution? I just hooked into the saving-event of a media file, checking if the file in this folder already exists and if so, just replace it instead of counting it up. (with this file, you always overwrite an existing file with a new one - there will be no choice!)
Just copy this code into a file e.g. overwriteMediaFiles.cs and place it in your App_Code Folder or include it in your own binary-file of you web-project:
Thomas - thanks for this great bit of code. I will test implement and let you know how it works out in my scenario. Thanks for the lead into hooking into the events. I might write up some delete file behavior for when a media item is removed from the recycle bin. I Just had another client last week using 7.6.4 confused as hell about how to physically remove a file of the filesystem after they thought they were permanently removing media items. I have yet to test if these functionality now exists in later versions.
Cheers!
Jamie
Hi, Jamie,
you are welcome. Hope it helps with your scenario.
I just had a delete-issue with media files today. We removed an image, also deleted the physical media-path. BUT: be aware of the imageProcessor-Cache.
So, we had the case, that the image cannot be called with the normal URL:
e.g. "/media/12345/picname.jpg".
BUT still be reachable, if you use it with an imageprocessor-Querystring:
"/media/12345/picname.jpg?autorotate=true".
This is a serious problem, cause we had an copy-right issue and was forced by a laywer to remove the image. We removed it in the believe, it is really removed, even checked the url (but without thinking of the image processor). And this get us in kind of trouble, as you can imagine.
So if you want to delete an image, be aware of the image-processor caching. :)
is working on a reply...