【发布时间】:2014-08-27 17:48:25
【问题描述】:
我有一个 Composite C1 4.04 站点。
用户需要一个博客 - 他们可以上传图片。
但是,图像进入了一些奇怪的虚拟“媒体”文件夹,该文件夹显然不存在 - 并且它们不像普通图像那样存储。
我希望它们只是进入一个常规文件夹 - 因为我需要稍后操作它们 - 以重新压缩它们(例如)。
我该怎么做?
谢谢
【问题讨论】:
标签: c1-cms
我有一个 Composite C1 4.04 站点。
用户需要一个博客 - 他们可以上传图片。
但是,图像进入了一些奇怪的虚拟“媒体”文件夹,该文件夹显然不存在 - 并且它们不像普通图像那样存储。
我希望它们只是进入一个常规文件夹 - 因为我需要稍后操作它们 - 以重新压缩它们(例如)。
我该怎么做?
谢谢
【问题讨论】:
标签: c1-cms
媒体文件在Composite C1中是可插入的,在默认实现中媒体文件表示为
这有一定的优势 - 拥有数据库记录允许保留与服务 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);
【讨论】: