微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Umbraco Mediaservice内存不足异常,但文件已上传

如何解决Umbraco Mediaservice内存不足异常,但文件已上传

添加了hangfire来处理文件上传到媒体文件夹的过程。现在,我的后台进程正在上传1GB以上的文件。现在,如果文件小于1GB,则可以正常工作,但超出此范围时,运行此代码ApplicationContext.Current.Services.MediaService.Save(media);时出现SystemOutOfMemoryException。现在,我假设它确实无法在media文件夹中创建文件,但是在检查此文件夹后,它能够将文件成功移动到该​​文件夹​​,这只是引发systemoutofmemory异常,而我不能当我登录CMS-> Media页面时看到它。我不确定在这里做什么,因为问题将在于文件处理是否成功创建了Media文件夹。现在在我的代码中,它将假定由于异常而导致失败,因此它将尝试再次处理该文件,这将重复并占用内存空间。

现在我的问题是

  1. 为什么实际上将文件成功移动到媒体文件夹后会给出SystemOutOfMemoryException
  2. 由于无法完成该过程,但是成功地将文件移动到了正确的媒体目录(具有正确的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 举报,一经查实,本站将立刻删除。