Umbraco 添加带有 SetValue 的 base64 文件
Umbraco Adding base64 File with SetValue
我会马上解释这个问题,但首先...这是可以实现的吗?
我在 Umbraco 中有一个文档类型,我在其中存储来自表单的数据。我可以存储除文件之外的所有内容。
...
content.SetValue("notes", item.Notes);
content.SetValue("curriculum", item.Curriculum); /*this is the file*/
...
我正在添加这样的项目,其中 SetValue 来自以下命名空间 namespace Umbraco.Core.Models 这是函数签名 void SetValue(string propertyTypeAlias, 对象值)
而return错误如下
"字符串或二进制数据将被截断。
↵声明已终止。"
我是不是误会了什么?我不应该发送base64吗?我将图像添加到一个媒体文件中,它会在其中创建一个带有序列号的子文件夹。如果我尝试添加一个现有文件夹,它会很好地附加文件,但如果我指向一个新的媒体子文件夹,它也会 return 出错。关于我应该如何处理这个问题有什么想法吗?
提前致谢
编辑 1: 在 Cryothic 回答后我更新了我的代码
byte[] tempByte = Convert.FromBase64String(item.Curriculum);
var mediaFile = _mediaService.CreateMedia(item.cvExtension, -1, Constants.Conventions.MediaTypes.File);
Stream fileStream = new MemoryStream(tempByte);
var fileName = Path.GetFileNameWithoutExtension(item.cvExtension);
mediaFile.SetValue("umbracoFile", fileName, fileStream);
_mediaService.Save(mediaFile);
错误发生在mediaFile.SetValue(...)。
如果我从 umbraco 上传文件,它会转到“http://localhost:3295/media/1679/test.txt" and the next one would go to "http://localhost:3295/media/1680/test.txt”。根据我的要求,我应该在哪里告诉它必须添加到 /media 文件夹并递增?我是否只指向媒体文件夹,umbaco 处理增量部分?
如果我将 SetValue 更改为以下 mediaFile.SetValue("curriculum", fileName, fileStream); 请求成功但文件未添加到内容本身和文件被添加到“http://localhost:3295/umbraco/media" instead of "http://localhost:3295/media”。
如果我尝试以下 - content.SetValue("curriculum", item.cvExtension); - 文件被添加到内容中但路径“http://localhost:3295/umbraco/test.txt”。
我不太了解 umbraco 如何将文件插入媒体文件夹(在 umbraco 之外)以及如何将媒体服务路径添加到内容服务。
你需要保存base64吗?
我做过类似的事情,但使用的是 MediaService。
我的项目可以选择在多个向导步骤中上传多张图片,我需要一次保存所有图片。所以我每一步循环上传的文件(HttpFileCollection)。 acceptedFiletypes 是一个字符串列表,其中包含我允许的 mimetypes。
for (int i = 0; i < files.Count; i++) {
byte[] fileData = null;
UploadedFile uf = null;
try {
if (acceptedFiletypes.Contains(files[i].ContentType)) {
using (var binaryReader = new BinaryReader(files[i].InputStream)) {
fileData = binaryReader.ReadBytes(files[i].ContentLength);
}
if (fileData.Length > 0) {
uf = new UploadedFile {
FileName = files[i].FileName,
FileType = fileType,
FileData = fileData
};
}
}
}
catch { }
if (uf != null) {
projectData.UploadedFiles.Add(uf);
}
}
在最后一步之后,我将遍历 projectData.UploadedFiles 并执行以下操作。
var service = Umbraco.Core.ApplicationContext.Current.Services.MediaService;
var mediaTypeAlias = "Image";
var mediaItem = service.CreateMedia(fileName, parentFolderID, mediaTypeAlias);
Stream fileStream = new MemoryStream(file.FileData);
mediaItem.SetValue("umbracoFile", fileName, fileStream);
service.Save(mediaItem);
我还检查了上传的文件名是否以“.pdf”结尾。在那种情况下,我会将 mediaTypeAlias 更改为 "File".
希望对您有所帮助。
我会马上解释这个问题,但首先...这是可以实现的吗?
我在 Umbraco 中有一个文档类型,我在其中存储来自表单的数据。我可以存储除文件之外的所有内容。
...
content.SetValue("notes", item.Notes);
content.SetValue("curriculum", item.Curriculum); /*this is the file*/
...
我正在添加这样的项目,其中 SetValue 来自以下命名空间 namespace Umbraco.Core.Models 这是函数签名 void SetValue(string propertyTypeAlias, 对象值)
而return错误如下
"字符串或二进制数据将被截断。 ↵声明已终止。"
我是不是误会了什么?我不应该发送base64吗?我将图像添加到一个媒体文件中,它会在其中创建一个带有序列号的子文件夹。如果我尝试添加一个现有文件夹,它会很好地附加文件,但如果我指向一个新的媒体子文件夹,它也会 return 出错。关于我应该如何处理这个问题有什么想法吗?
提前致谢
编辑 1: 在 Cryothic 回答后我更新了我的代码
byte[] tempByte = Convert.FromBase64String(item.Curriculum);
var mediaFile = _mediaService.CreateMedia(item.cvExtension, -1, Constants.Conventions.MediaTypes.File);
Stream fileStream = new MemoryStream(tempByte);
var fileName = Path.GetFileNameWithoutExtension(item.cvExtension);
mediaFile.SetValue("umbracoFile", fileName, fileStream);
_mediaService.Save(mediaFile);
错误发生在mediaFile.SetValue(...)。
如果我从 umbraco 上传文件,它会转到“http://localhost:3295/media/1679/test.txt" and the next one would go to "http://localhost:3295/media/1680/test.txt”。根据我的要求,我应该在哪里告诉它必须添加到 /media 文件夹并递增?我是否只指向媒体文件夹,umbaco 处理增量部分?
如果我将 SetValue 更改为以下 mediaFile.SetValue("curriculum", fileName, fileStream); 请求成功但文件未添加到内容本身和文件被添加到“http://localhost:3295/umbraco/media" instead of "http://localhost:3295/media”。
如果我尝试以下 - content.SetValue("curriculum", item.cvExtension); - 文件被添加到内容中但路径“http://localhost:3295/umbraco/test.txt”。
我不太了解 umbraco 如何将文件插入媒体文件夹(在 umbraco 之外)以及如何将媒体服务路径添加到内容服务。
你需要保存base64吗? 我做过类似的事情,但使用的是 MediaService。
我的项目可以选择在多个向导步骤中上传多张图片,我需要一次保存所有图片。所以我每一步循环上传的文件(HttpFileCollection)。 acceptedFiletypes 是一个字符串列表,其中包含我允许的 mimetypes。
for (int i = 0; i < files.Count; i++) {
byte[] fileData = null;
UploadedFile uf = null;
try {
if (acceptedFiletypes.Contains(files[i].ContentType)) {
using (var binaryReader = new BinaryReader(files[i].InputStream)) {
fileData = binaryReader.ReadBytes(files[i].ContentLength);
}
if (fileData.Length > 0) {
uf = new UploadedFile {
FileName = files[i].FileName,
FileType = fileType,
FileData = fileData
};
}
}
}
catch { }
if (uf != null) {
projectData.UploadedFiles.Add(uf);
}
}
在最后一步之后,我将遍历 projectData.UploadedFiles 并执行以下操作。
var service = Umbraco.Core.ApplicationContext.Current.Services.MediaService;
var mediaTypeAlias = "Image";
var mediaItem = service.CreateMedia(fileName, parentFolderID, mediaTypeAlias);
Stream fileStream = new MemoryStream(file.FileData);
mediaItem.SetValue("umbracoFile", fileName, fileStream);
service.Save(mediaItem);
我还检查了上传的文件名是否以“.pdf”结尾。在那种情况下,我会将 mediaTypeAlias 更改为 "File".
希望对您有所帮助。