【问题标题】:Composite C1 blog - not using media folderComposite C1 博客 - 不使用媒体文件夹
【发布时间】:2014-08-27 17:48:25
【问题描述】:

我有一个 Composite C1 4.04 站点。

用户需要一个博客 - 他们可以上传图片。

但是,图像进入了一些奇怪的虚拟“媒体”文件夹,该文件夹显然不存在 - 并且它们不像普通图像那样存储。

我希望它们只是进入一个常规文件夹 - 因为我需要稍后操作它们 - 以重新压缩它们(例如)。

我该怎么做?

谢谢

【问题讨论】:

    标签: c1-cms


    【解决方案1】:

    媒体文件在Composite C1中是可插入的,在默认实现中媒体文件表示为

    1. 数据库中的一条记录,包含文件的元数据(mime 类型等)
    2. 包含内容的物理文件,位于“\App_Data\Media” f.e. \App_Data\Media\0b11c288-5432-4482-a776-3eb0ac9ad437

    这有一定的优势 - 拥有数据库记录允许保留与服务 http 请求(例如 MimeType)相关的其他元数据,对这些文件应用安全性等。 ;文件名也不遵循文件系统限制(例如路径长度和某些保留名称/禁止字符) - 所以当您上传文件时, 您不必关心网站文件夹路径 + 媒体文件夹路径 + 文件名是否会超过 255 个字符。

    还有其他媒体存档插件,当 f.e.文件保存在 SQL 数据库中或从 Facebook 相册中获取文件。

    如果要压缩图像文件,可以遍历 \App_Data\Media\ 文件夹中的文件。您可以通过在 DataConnection 实例上调用 Get() 来获取媒体文件列表。

    如果要将媒体导出到不同的解决方案,可以使用以下代码将 Composite C1 媒体文件夹复制到物理文件夹:

    private int MediaToFiles(string mediaFolder, string physicalFolder)
    {
        if (!mediaFolder.StartsWith("/"))
        {
            mediaFolder = "/" + mediaFolder;
        }
    
        string mediaFolderPrefix = mediaFolder == "/" ? "/" : mediaFolder + "/";
        using (var conn = new DataConnection())
        {
            var mediaFiles = conn.Get<IMediaFile>().Where(f => string.Equals(f.FolderPath, mediaFolder, StringComparison.OrdinalIgnoreCase)
                                                               || f.FolderPath.StartsWith(mediaFolderPrefix, StringComparison.OrdinalIgnoreCase))
                                                   .ToList();
            if(mediaFiles.Count == 0) return 0;
    
            Directory.CreateDirectory(physicalFolder);
    
            int newFiles = 0;
    
            foreach (var file in mediaFiles)
            {
                string targetFolder = file.FolderPath.Length <= mediaFolderPrefix.Length ?
                            physicalFolder : Path.Combine(physicalFolder, file.FolderPath.Substring(mediaFolderPrefix.Length));
                Directory.CreateDirectory(targetFolder);
    
                string targetFilePath = Path.Combine(targetFolder, file.FileName);
    
                if(File.Exists(targetFilePath) && File.GetLastWriteTime(targetFilePath) == file.LastWriteTime) continue;
    
                using (var stream = file.GetReadStream())
                {
                    using (var outputStream = File.Create(targetFilePath, 8192))
                    {
                        stream.CopyTo(outputStream);
    
                        outputStream.Close();
                    }
                }
    
                File.SetLastWriteTime(targetFilePath, file.LastWriteTime.Value);
    
                newFiles++;
            }
    
            return newFiles;
        }
    }
    
    
    
    // Example of usage:
    int newFiles = MediaToFiles("/", @"c:\Temp\C1media"); // Copying all the media files
    OutPut("New files: " + newFiles);
    
    
    int newFiles2 = MediaToFiles("/Office", @"c:\Temp\C1media\Office pictures"); // Copying only "Office" media folder
    OutPut("New files: " + newFiles2);
    

    【讨论】:

    • 感谢非常有帮助。我怎么能完全放弃媒体文件夹,只让用户将图像上传到物理文件夹(可能在文件名中添加了 guid)?将 MIME 类型存储在数据库中对我来说不值得。
    • 您必须实现自己的数据提供程序,这可能需要大量工作。参见类 Composite.Plugins.Data.DataProviders.MediaFileProvider.MediaFileProvider
    • 谢谢。我需要重新压缩图像,也许我可以使用更好的图像压缩插件。那将否定我对此的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多