Umbraco使用SetValue

时间:2018-07-09 17:53:14

标签: c# file-upload umbraco

我会立即说明问题,但首先...这可以实现吗?

我在Umbraco中有一个文档类型,我在其中存储来自表单的数据。我可以存储文件以外的所有内容。

        ...
        content.SetValue("notes", item.Notes);
        content.SetValue("curriculum", item.Curriculum); /*this is the file*/
        ...

我要添加这样的项目,其中SetValue来自以下命名空间名称空间Umbraco.Core.Models ,这是函数签名 void SetValue(string propertyTypeAlias,object value)

返回错误如下

“字符串或二进制数据将被截断。 ↵该声明已终止。“

我误会了什么吗?我不应该发送base64吗?我将图像添加到媒体文件中,在该文件中它创建了一个具有序号的子文件夹。如果我尝试添加现有文件夹,它会很好地附加文件,但是如果我指向新的媒体子文件夹,它也会返回错误。关于如何解决这个问题的任何想法?

预先感谢

编辑1: Crothic 回答后,我已使用以下代码更新了代码

        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”,下一个将转到“ http://localhost:3295/media/1680/test.txt”。我应在哪里告诉我它必须添加到 / media 文件夹并递增?我是否只指向媒体文件夹,而umbaco处理增量部分?

如果我将SetValue更改为以下 mediaFile.SetValue(“ curriculum”,fileName,fileStream); ,请求会成功,但是文件不会添加到内容本身中,并且文件会添加到“ http://localhost:3295/umbraco/media”代替“ http://localhost:3295/media”。

如果我尝试以下操作- content.SetValue(“ curriculum”,item.cvExtension); -将文件添加到内容中,但路径为“ http://localhost:3295/umbraco/test.txt”。 / p>

我不太了解umbraco如何将文件插入媒体文件夹(在umbraco之外)以及如何将媒体服务路径添加到内容服务。

1 个答案:

答案 0 :(得分:1)

需要保存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更改为“文件”。

我希望这会有所帮助。