Pārlūkot izejas kodu

convert upload image url to rest

LukePulverenti 12 gadi atpakaļ
vecāks
revīzija
b075e0a5b9

+ 1 - 21
MediaBrowser.Api/ApiService.cs

@@ -1,6 +1,4 @@
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
-using System;
+using System;
 using System.Net;
 
 namespace MediaBrowser.Api
@@ -10,24 +8,6 @@ namespace MediaBrowser.Api
     /// </summary>
     public static class ApiService
     {
-        /// <summary>
-        /// Gets a User by Id
-        /// </summary>
-        /// <param name="id">The id of the user</param>
-        /// <returns>User.</returns>
-        /// <exception cref="System.ArgumentNullException">id</exception>
-        public static User GetUserById(string id)
-        {
-            if (string.IsNullOrEmpty(id))
-            {
-                throw new ArgumentNullException("id");
-            }
-
-            var guid = new Guid(id);
-
-            return Kernel.Instance.GetUserById(guid);
-        }
-
         /// <summary>
         /// Determines whether [is API URL match] [the specified URL].
         /// </summary>

+ 99 - 2
MediaBrowser.Api/Images/ImageService.cs

@@ -1,4 +1,6 @@
-using MediaBrowser.Common.Extensions;
+using System.Threading;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.IO;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
@@ -9,6 +11,7 @@ using System;
 using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
+using ServiceStack.Text.Controller;
 
 namespace MediaBrowser.Api.Images
 {
@@ -101,7 +104,7 @@ namespace MediaBrowser.Api.Images
     /// </summary>
     [Route("/Users/{Id}/Images/{Type}", "DELETE")]
     [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")]
-    public class DeleteUserImage : DeleteImageRequest
+    public class DeleteUserImage : DeleteImageRequest, IReturnVoid
     {
         /// <summary>
         /// Gets or sets the id.
@@ -109,6 +112,23 @@ namespace MediaBrowser.Api.Images
         /// <value>The id.</value>
         public Guid Id { get; set; }
     }
+
+    [Route("/Users/{Id}/Images/{Type}", "POST")]
+    [Route("/Users/{Id}/Images/{Type}/{Index}", "POST")]
+    public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid
+    {
+        /// <summary>
+        /// Gets or sets the id.
+        /// </summary>
+        /// <value>The id.</value>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// The raw Http Request Input Stream
+        /// </summary>
+        /// <value>The request stream.</value>
+        public Stream RequestStream { get; set; }
+    }
     
     /// <summary>
     /// Class ImageService
@@ -197,6 +217,26 @@ namespace MediaBrowser.Api.Images
             return GetImage(request, item);
         }
 
+        /// <summary>
+        /// Posts the specified request.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        public void Post(PostUserImage request)
+        {
+            var kernel = (Kernel)Kernel;
+
+            var pathInfo = PathInfo.Parse(Request.PathInfo);
+            var id = new Guid(pathInfo.GetArgumentValue<string>(1));
+
+            request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue<string>(3), true);
+
+            var item = kernel.Users.First(i => i.Id == id);
+
+            var task = PostImage(item, request.RequestStream, request.Type, Request.ContentType);
+
+            Task.WaitAll(task);
+        }
+
         /// <summary>
         /// Deletes the specified request.
         /// </summary>
@@ -280,5 +320,62 @@ namespace MediaBrowser.Api.Images
 
             return kernel.ImageManager.GetImagePath(item, request.Type, index);
         }
+
+        /// <summary>
+        /// Posts the image.
+        /// </summary>
+        /// <param name="entity">The entity.</param>
+        /// <param name="inputStream">The input stream.</param>
+        /// <param name="imageType">Type of the image.</param>
+        /// <param name="mimeType">Type of the MIME.</param>
+        /// <returns>Task.</returns>
+        private async Task PostImage(BaseItem entity, Stream inputStream, ImageType imageType, string mimeType)
+        {
+            using (var reader = new StreamReader(inputStream))
+            {
+                var text = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+                var bytes = Convert.FromBase64String(text);
+
+                string filename;
+
+                switch (imageType)
+                {
+                    case ImageType.Art:
+                        filename = "clearart";
+                        break;
+                    case ImageType.Primary:
+                        filename = "folder";
+                        break;
+                    default:
+                        filename = imageType.ToString().ToLower();
+                        break;
+                }
+
+                var extension = mimeType.Substring(mimeType.IndexOf('/') + 1);
+
+                var oldImagePath = entity.GetImage(imageType);
+
+                var imagePath = Path.Combine(entity.MetaLocation, filename + "." + extension);
+
+                // Save to file system
+                using (var fs = new FileStream(imagePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
+                {
+                    await fs.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
+                }
+
+                // Set the image
+                entity.SetImage(imageType, imagePath);
+
+                // If the new and old paths are different, delete the old one
+                if (!string.IsNullOrEmpty(oldImagePath) && !oldImagePath.Equals(imagePath, StringComparison.OrdinalIgnoreCase))
+                {
+                    File.Delete(oldImagePath);
+                }
+
+                // Directory watchers should repeat this, but do a quick refresh first
+                await entity.RefreshMetadata(CancellationToken.None, forceSave: true, allowSlowProviders: false).ConfigureAwait(false);
+            }
+        }
     }
 }

+ 0 - 141
MediaBrowser.Api/Images/UploadImageHandler.cs

@@ -1,141 +0,0 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net.Handlers;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Entities;
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Images
-{
-    /// <summary>
-    /// Class UploadImageHandler
-    /// </summary>
-    class UploadImageHandler : BaseActionHandler<Kernel>
-    {
-        /// <summary>
-        /// The _source entity
-        /// </summary>
-        private BaseItem _sourceEntity;
-
-        /// <summary>
-        /// Gets the source entity.
-        /// </summary>
-        /// <returns>Task{BaseItem}.</returns>
-        private async Task<BaseItem> GetSourceEntity()
-        {
-            if (_sourceEntity == null)
-            {
-                if (!string.IsNullOrEmpty(QueryString["personname"]))
-                {
-                    _sourceEntity =
-                        await Kernel.LibraryManager.GetPerson(QueryString["personname"]).ConfigureAwait(false);
-                }
-
-                else if (!string.IsNullOrEmpty(QueryString["genre"]))
-                {
-                    _sourceEntity =
-                        await Kernel.LibraryManager.GetGenre(QueryString["genre"]).ConfigureAwait(false);
-                }
-
-                else if (!string.IsNullOrEmpty(QueryString["year"]))
-                {
-                    _sourceEntity =
-                        await
-                        Kernel.LibraryManager.GetYear(int.Parse(QueryString["year"])).ConfigureAwait(false);
-                }
-
-                else if (!string.IsNullOrEmpty(QueryString["studio"]))
-                {
-                    _sourceEntity =
-                        await Kernel.LibraryManager.GetStudio(QueryString["studio"]).ConfigureAwait(false);
-                }
-
-                else if (!string.IsNullOrEmpty(QueryString["userid"]))
-                {
-                    _sourceEntity = ApiService.GetUserById(QueryString["userid"]);
-                }
-
-                else
-                {
-                    _sourceEntity = DtoBuilder.GetItemByClientId(QueryString["id"]);
-                }
-            }
-
-            return _sourceEntity;
-        }
-
-        /// <summary>
-        /// Gets the type of the image.
-        /// </summary>
-        /// <value>The type of the image.</value>
-        private ImageType ImageType
-        {
-            get
-            {
-                var imageType = QueryString["type"];
-
-                return (ImageType)Enum.Parse(typeof(ImageType), imageType, true);
-            }
-        }
-
-        /// <summary>
-        /// Performs the action.
-        /// </summary>
-        /// <returns>Task.</returns>
-        protected override async Task ExecuteAction()
-        {
-            var entity = await GetSourceEntity().ConfigureAwait(false);
-
-            using (var reader = new StreamReader(HttpListenerContext.Request.InputStream))
-            {
-                var text = await reader.ReadToEndAsync().ConfigureAwait(false);
-
-                var bytes = Convert.FromBase64String(text);
-
-                string filename;
-
-                switch (ImageType)
-                {
-                    case ImageType.Art:
-                        filename = "clearart";
-                        break;
-                    case ImageType.Primary:
-                        filename = "folder";
-                        break;
-                    default:
-                        filename = ImageType.ToString().ToLower();
-                        break;
-                }
-
-                // Use the client filename to determine the original extension
-                var clientFileName = QueryString["filename"];
-
-                var oldImagePath = entity.GetImage(ImageType);
-
-                var imagePath = Path.Combine(entity.MetaLocation, filename + Path.GetExtension(clientFileName));
-
-                // Save to file system
-                using (var fs = new FileStream(imagePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
-                {
-                    await fs.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
-                }
-
-                // Set the image
-                entity.SetImage(ImageType, imagePath);
-
-                // If the new and old paths are different, delete the old one
-                if (!string.IsNullOrEmpty(oldImagePath) && !oldImagePath.Equals(imagePath, StringComparison.OrdinalIgnoreCase))
-                {
-                    File.Delete(oldImagePath);
-                }
-
-                // Directory watchers should repeat this, but do a quick refresh first
-                await entity.RefreshMetadata(CancellationToken.None, forceSave: true, allowSlowProviders: false).ConfigureAwait(false);
-            }
-        }
-    }
-}

+ 7 - 7
MediaBrowser.Api/Javascript/ApiClient.js

@@ -613,15 +613,15 @@ var ApiClient = {
 
             var data = window.btoa(e.target.result);
 
-            var params = {
-                userId: userId,
-                type: imageType,
-                filename: file.name
-            };
+            var url = ApiClient.getUrl("Users/" + userId + "/Images/" + imageType);
 
-            var url = ApiClient.getUrl("UploadImage", params);
+            $.ajax({
+                type: "POST",
+                url: url,
+                data: data,
+                contentType: "image/" + file.name.substring(file.name.lastIndexOf('.') + 1)
 
-            $.post(url, data).done(function (result) {
+            }).done(function (result) {
 
                 deferred.resolveWith(null, [result]);
 

+ 0 - 1
MediaBrowser.Api/MediaBrowser.Api.csproj

@@ -78,7 +78,6 @@
     <Compile Include="Images\ImageRequest.cs" />
     <Compile Include="Images\ImageService.cs" />
     <Compile Include="Images\ImageWriter.cs" />
-    <Compile Include="Images\UploadImageHandler.cs" />
     <Compile Include="Javascript\JavascriptApiClientService.cs" />
     <Compile Include="Library\LibraryHelpers.cs" />
     <Compile Include="Library\LibraryService.cs" />