diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 23:39:53 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 23:39:53 -0500 |
| commit | b075e0a5b963435c67b7027f85b51ff181adc2d1 (patch) | |
| tree | eebc13b5bc82de65c7d977295c5106f7d9d2ed76 | |
| parent | add43baffef74fcd34cfc6ef02d36777be05b274 (diff) | |
convert upload image url to rest
| -rw-r--r-- | MediaBrowser.Api/ApiService.cs | 22 | ||||
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 101 | ||||
| -rw-r--r-- | MediaBrowser.Api/Images/UploadImageHandler.cs | 141 | ||||
| -rw-r--r-- | MediaBrowser.Api/Javascript/ApiClient.js | 14 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 1 |
5 files changed, 107 insertions, 172 deletions
diff --git a/MediaBrowser.Api/ApiService.cs b/MediaBrowser.Api/ApiService.cs index e6e4594c1..33ea492e0 100644 --- a/MediaBrowser.Api/ApiService.cs +++ b/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 @@ -11,24 +9,6 @@ namespace MediaBrowser.Api 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> /// <param name="url">The URL.</param> diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 113bad083..d3d76f4f2 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/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 @@ -198,6 +218,26 @@ namespace MediaBrowser.Api.Images } /// <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> /// <param name="request">The request.</param> @@ -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); + } + } } } diff --git a/MediaBrowser.Api/Images/UploadImageHandler.cs b/MediaBrowser.Api/Images/UploadImageHandler.cs deleted file mode 100644 index 758e96d85..000000000 --- a/MediaBrowser.Api/Images/UploadImageHandler.cs +++ /dev/null @@ -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); - } - } - } -} diff --git a/MediaBrowser.Api/Javascript/ApiClient.js b/MediaBrowser.Api/Javascript/ApiClient.js index e82238d24..84e54597b 100644 --- a/MediaBrowser.Api/Javascript/ApiClient.js +++ b/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]); diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 81ff1001b..896e1d438 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/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" /> |
