复合C1博客 - 不使用媒体文件夹

时间:2014-08-26 09:36:24

标签: c1-cms

我有一个复合C1 4.04网站。

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

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

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

我该怎么做?

THX

1 个答案:

答案 0 :(得分:1)

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

  1. 数据库中的记录,包含文件的元数据(mime类型等)
  2. 包含内容的物理文件,位于" \ App_Data \ Media" F.E. \ App_Data文件\媒体\ 0b11c288-5432-4482-a776-3eb0ac9ad437
  3. 这具有一定的优势 - 拥有数据库记录允许保留与提供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);