如何解决Umbraco Mediaservice内存不足异常,但文件已上传
我添加了hangfire来处理文件上传到媒体文件夹的过程。现在,我的后台进程正在上传1GB以上的文件。现在,如果文件小于1GB,则可以正常工作,但超出此范围时,运行此代码ApplicationContext.Current.Services.MediaService.Save(media);
时出现SystemOutOfMemoryException。现在,我假设它确实无法在media
文件夹中创建文件,但是在检查此文件夹后,它能够将文件成功移动到该文件夹,这只是引发systemoutofmemory异常,而我不能当我登录CMS-> Media页面时看到它。我不确定在这里做什么,因为问题将在于文件处理是否成功创建了Media文件夹。现在在我的代码中,它将假定由于异常而导致失败,因此它将尝试再次处理该文件,这将重复并占用内存空间。
现在我的问题是
- 为什么实际上将文件成功移动到媒体文件夹后会给出
SystemOutOfMemoryException
? - 由于无法完成该过程,但是成功地将文件移动到了正确的媒体目录(具有正确的autoid),如何才能手动向数据库插入一个条目以使其出现在CMS中?
感谢您的帮助。下面是我的代码
public string process()
{
string[] filePaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + "uploads");
string lastFileName = "";
foreach (string filePath in filePaths)
{
if (this.IsFileLocked(filePath)) {
continue;
}
try
{
using (Stream stream = System.IO.File.OpenRead(filePath))
{
string filename = Path.GetFileName(filePath);
lastFileName = filename;
//Constants.Conventions.MediaTypes.Image
string mediaType = Constants.Conventions.MediaTypes.File;
string ext = Path.GetExtension(filename);
if (ext == ".jpg" || ext == ".png" || ext == ".gif" || ext == ".jpeg")
{
mediaType = Constants.Conventions.MediaTypes.Image;
}
HttpContext.Current = new HttpContext(new HttpRequest(null,"https://www.google.com",null),new HttpResponse(null));
IMedia media = ApplicationContext.Current.Services.MediaService.CreateMedia(filename,Constants.System.Root,mediaType);
//IMedia media = Services.MediaService.CreateMedia(filename,mediaType);
media.SetValue("umbracoFile",filename,stream);
// Save the media
ApplicationContext.Current.Services.MediaService.Save(media);
media = null;
}
System.IO.File.Delete(filePath);
Console.WriteLine($"{filePath} is deleted.");
break;
} catch (Exception e) {
Console.WriteLine($"{filePath} Failed to process." + e.Message);
return filePath + " Failed to process " + e.Message;
}
}
return lastFileName + " Process successful!";
}
注意:hangfire后台作业正在调用此函数,这就是我嘲笑HttpContext
解决方法
我在这里的猜测是,如果它是图像,那将是试图为后台生成图像缩略图的原因。 1GB是要上传到网站的相当大的图像,调整其大小以生成缩略图可能会占用很多内存。
也就是说,我有一个CMS使用的站点可以上传1GB以上的图像,但是该站点托管在具有大量RAM的计算机上,因此将其运行在内存不足的位置可能需要做些事情。
您使用的是哪个版本的Umbraco,托管的计算机的规格是什么?
,好吧,我经过数周的努力并尝试将服务器配置为处理大文件后,才弄清楚问题出在哪里。证明服务器配置,我的本地开发人员足以处理大文件。问题出在这行
ApplicationContext.Current.Services.MediaService.Save(media)
似乎我不确定这里幕后发生的事情,但是对于这种代码,它仅适用于小于1GB的文件(我没有足够的证据来支持这一点)。但是当我检查另一个可用参数时,它具有另一个覆盖范围,该覆盖范围位于下方
int user_id = 1;
int showError = false;
ApplicationContext.Current.Services.MediaService.Save(media,user_id,showError);
因此,据此,我可以传递另外两个参数。 User_id和ShowError。因此,基本上我的猜测是,它正在尝试查找上载文件的user_id,但是默认情况下,由于我使用的是后台服务,因此它没有user_id凭据,因此“也许”它是在试图确定谁是实际登录的用户,但是它是后台服务请求,因此无法找到它。然后是第三个选项,即ShowError。默认情况下,它设置为True,因此当它没有遇到user_id或可能用完了它的保留内存试图重试user_id时,将引发SystemOutOfMemory异常。
现在,我实际上无法证明我的“猜测”是正确的,但是,一旦添加了这2个参数,它就可以成功保存,甚至不需要2秒即可处理1GB以上的文件。
请特别评论MediaService.Save(media)
函数的实际作用。
注意:我的请求来自由Hangfire触发的后台服务。当我添加2个可选参数UPLOADER / USERID和SHOWERROR时,我没有遇到错误
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。