【问题标题】:Umbraco Adding base64 File with SetValueUmbraco 使用 SetValue 添加 base64 文件
【发布时间】:2018-12-17 11:36:44
【问题描述】:

我会马上解释这个问题,但首先……这可以实现吗?

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

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

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

并且返回错误如下

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

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

提前致谢

编辑 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”,下一个文件会转到“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”。

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

【问题讨论】:

    标签: c# file-upload umbraco


    【解决方案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 更改为“File”。

    我希望这会有所帮助。

    【讨论】:

    • 无需另存为 bas64,但我将文件保存为 base64 字符串。我只需要保存一个文件,因此无需遍历所有文件。我的目标是保存简历,这意味着我需要保存 pdf 或 docx(或其他文字格式)。我应该对所有这些都使用 mediaTypeAlias "File" 吗?在这周里,我将尝试这个实现,并就我的进展给你反馈。感谢您的帮助
    • 应该将 docx 或 pdf 保存为 mediaTypeAlias "File" 是的。祝你好运。
    • 所以我已经测试了你的方法,即使事情变得更有意义我得到了一个错误。我会用其他信息更新我的问题。
    • 我还没有在 Umbraco 中保存任何 base64 图像,所以我不知道这是否是原因。我只是发布到控制器并读取 Request.Files 数组。您是否通过任何更改为您的网站使用虚拟文件夹?
    • Cryothic 在您的帮助下让它工作!原来我不需要 url 并且 url 是自动生成的。问题是我正在创建项目,但没有将其附加到我之前创建的项目。我需要 3 个参数。如果我没记错媒体类型,媒体名称和媒体本身。再次感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多