【问题标题】:ServiceStack - upload files as byte stream?ServiceStack - 将文件作为字节流上传?
【发布时间】:2014-10-10 04:17:03
【问题描述】:

我正在尝试使用自托管的 ServiceStack(单声道版本 4.0.31)创建自己的 S3 兼容服务器,并且我需要支持 s3curl.pl 格式的上传。问题是他们不使用多部分上传,但似乎使用默认的 http 二进制格式。我已经让 ServiceStack 用于多部分/表单数据上传。我还查看了有关相关主题的所有适用帖子,但没有一个对我有用。例如:ServiceStack - Upload files with stream and with Uri 看起来可以解决我的问题。问题是我无法为该解决方案解析 RequestContext.Files 。

这是我的 curl 命令行(请注意,Auth 是伪造的,因此不存在安全风险):

curl -H 'Date: Thu, 09 Oct 2014 16:56:21 +0000' -H 'Authorization: AWS Y29tZXQ=:ciitxdxRvWrlcVsc48JnXqKu/oY=' -L -H 'content-type: ' -T README.txt 'http://localhost:1301/s3/README.txt?format=xml' -k

【问题讨论】:

    标签: http servicestack http-upload


    【解决方案1】:

    base.Request.Files API 仅用于处理 HTTP multipart/form-data 文件上传。

    要处理其他文件上传,您可以使用 IRequiresRequestStream 装饰您的请求 DTO,这会告诉 ServiceStack 跳过反序列化并将原始 InputStream 注入您的 DTO:

    public class RawFileUpload : IRequiresRequestStream
    {
        public Stream RequestStream { get; set; }
    }
    

    在你的服务中你可以处理

    public class UploadServices : Service
    {
        public object Any(RawFileUpload request)
        {
            var filePath = "~/uploads/{0}".Fmt(Guid.NewGuid().ToString("n"))
                           .MapAbsolutePath();
            using (var fs = File.OpenWrite(filePath))
            {
                request.RequestStream.WriteTo(fs);
            }
            //...
        }
    }
    

    Serialization/Deserialization wiki 中描述了此功能。

    【讨论】:

    • 谢谢,这行得通!是否可以将路线与流结合起来,或者它们是否相互排斥?我尝试在 DTO 中保留其他变量,但值是 null。S3 URI 格式是 /mybucket/photos/2014/08/puppy.jpg?x-foo=bar 我想我必须把这些字段拉出来如果我不能通过 DTO 同时进行上传和路由提取,我自己的 Request.RawUrl 呢? - 顺便说一句,我是 ServiceStack 的忠实粉丝,我现在正在用它构建一个主要产品。
    • @tradetree 以前没有,您需要从base.Request 提取值,但我只是added support for it in this commit。此更改现在是 available on MyGet
    • 好的,很高兴知道。我希望坚持使用成熟版本以保证我们开发的稳定性,但很高兴听到它会在未来出现。
    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2018-06-03
    • 1970-01-01
    • 2013-10-26
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多