rauhryan
1/23/2013 - 8:42 PM

Ajax file upload with jquery.forms

Ajax file upload with jquery.forms

  public class AjaxFileUploadWriter<T> : IMediaWriter<T>
    {
        readonly IOutputWriter _writer;

        public AjaxFileUploadWriter(IOutputWriter writer)
        {
            _writer = writer;
        }

        public void Write(string mimeType, T resource)
        {
            var rawJsonOutput = JsonUtil.ToJson(resource);
            
            // For proper jquery.form plugin support of file uploads
            // See the discussion on the File Uploads sample at http://malsup.com/jquery/form/#code-samples
            var html = "<html><body><textarea rows=\"10\" cols=\"80\">" + rawJsonOutput +
                "</textarea></body></html>";
            _writer.Write(MimeType.Html.ToString(), html);
        }

        public IEnumerable<string> Mimetypes
        {
            get { yield return MimeType.Html.Value; }
        }
    }

    public class AjaxFileUploadPolicy : IConfigurationAction
    {
        public void Configure(BehaviorGraph graph)
        {
            //note: OutputNode<T> -> OutputNode - I may have gaffed something.
            graph.Behaviors.Where(Filter)
                .Each(c =>
                {
                    c.AlterConnegOutput(output =>
                    {
                        output.AddWriter<AjaxFileUploadWriter<AjaxContinuation>>();
                    });
                });
        }

        public static bool Filter(BehaviorChain chain)
        {
            return chain.ResourceType().CanBeCastTo<AjaxContinuation>()
                   && chain.CheckFirstCall(c => c.HasAttribute<WrapJsonOutputInTextarea>());
        }
    }

    [AttributeUsage(AttributeTargets.Method)]
    public class WrapJsonOutputInTextarea : Attribute
    {
    }