Отправка изображения в веб-API - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть веб-API, который принимает изображение в качестве входных данных и сохраняет фотографию в некотором каталоге.Из контроллера веб-приложения я получу изображение, и мне нужно отправить изображение в веб-API.Как этого добиться?И веб-API, и веб-приложение создаются в ядре Dot net 2.1

Ниже приведены сведения о коде.

Код веб-API:

[Route("api/[controller]")]
[ApiController]
public class ImageTestController : ControllerBase
{
    //Image upload
    [HttpPost]
    public async Task<string> ImageUpload([FromForm]IFormFile file)
    {
        if (file.Length > 0)
        {
            try
            {
                if (!Directory.Exists("actualpath"))
                {
                    Directory.CreateDirectory("actualpath");
                }
                using (FileStream filestream =   System.IO.File.Create("actualpath" + file.FileName))
                {
                    file.CopyTo(filestream);
                    filestream.Flush();
                    return file.FileName;
                }
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }
        else
        {
            return "Unsuccessful";
        }

    }
}

контроллер веб-приложения

public class SampleController : Controller
{
   [HttpPost]
   public ActionResult SavePhoto(IFormFile fileParameter)
     {
            //In fileParameter i will recieve the image
         and i need to send this to Web API
     }
}

.cshtml: содержит элемент управления загрузкой пользовательского интерфейса kendo

<div class="demo-section k-content">
            @(Html.Kendo().Upload()
                     .Name("files")
                     .HtmlAttributes(new { aria_label = "files" } )
                      .Multiple(false)
                      .Async(a => a
            .Save("SavePhoto", "Sample")
            .AutoUpload(true)
            .SaveField("fileParameter")

            ))                       
</div>

В представлении после получения изображения изпользователь, он попадет в метод SavePhoto в контроллере Sample.Из контроллера мне нужен код для отправки изображения в API.Наконец я смогу сохранить фотографию.

1 Ответ

0 голосов
/ 22 февраля 2019

Я думаю, что гораздо лучше провести рефакторинг ваших ImageTestController и SampleController для совместного использования одного и того же ImageUploader сервиса.

// an interface that describes uploading image 
public interface IImageUploader{
    Task<string> UploadAsync(IFormFile file);
}

// upload an image to local file system (I just copy your code)
public class LocalImageUploader : IImageUploader{

    public async Task<string> UploadAsync(IFormFile file){
        if (file.Length > 0)
        {
            try
            {
                if (!Directory.Exists("actualpath"))
                {
                    Directory.CreateDirectory("actualpath");
                }
                using (FileStream filestream =   System.IO.File.Create("actualpath" + file.FileName))
                {
                    await file.CopyToAsync(filestream);
                    filestream.Flush();
                    return file.FileName;
                }
            }
            catch (System.Exception ex)
            {
                return ex.ToString();
            }
        }
        else
        {
            return "Unsuccessful";
        }

    }
}

А теперь зарегистрируйте сервис по:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddSingleton<IImageUploader,LocalImageUploader>();
}

Наконец, измените ваш контроллер, как показано ниже:

public class ImageTestController : ControllerBase
{
    private IImageUploader _uploader;

    public ImageTestController(IImageUploader uploader){
        this._uploader = uploader;
    }
    //Image upload
    [HttpPost]
    public async Task<string> ImageUpload([FromForm]IFormFile file)
    {
        var result= await this._uploader.UploadAsync(file);
        return result;
    }
}

public class SampleController : Controller
{
    private IImageUploader _uploader;

    public SampleController(IImageUploader uploader)
    {
        this._uploader = uploader;
    }

    [HttpPost]
    public async Task<ActionResult> SavePhoto(IFormFile fileParameter)
    {
        //In fileParameter i will recieve the image
        var result=await this._uploader.UploadAsync(fileParameter);
        return new JsonResult(new { });
    }
}

Кстати, я не думаю, что это хороший способ вернуть магическую строку в методе UploadAsync().Я предпочитаю создавать новый Result класс.


[Обновление]: Как использовать HttpClient для публикации изображения в Web API

  1. Создайте клиентскую службу загрузки, как показано ниже:
    public class HttpImageUploader 
    {
        private readonly HttpClient httpClient;

        public HttpImageUploader(HttpClient client)
        {
            this.httpClient = client;
        }

        public async Task<HttpResponseMessage> UploadAsync(IFormFile file)
        {
            var req= new HttpRequestMessage();
            req.Method = HttpMethod.Post;
            // you might need to update the uri 
            req.RequestUri = new Uri("https://localhost:5001/api/ImageTest/");
            HttpResponseMessage resp = null;
            using(var fs=file.OpenReadStream())
            {
                var form = new MultipartFormDataContent();

                var imageStream=new StreamContent(fs) ;
                imageStream.Headers.ContentType= new System.Net.Http.Headers.MediaTypeHeaderValue(file.ContentType);
                // because your WebAPI expects a field named as `file`
                form.Add( imageStream,"file", file.FileName);
                req.Content = form;
                resp = await this.httpClient.SendAsync(req);
            }
            return resp;
        }
    }
зарегистрируйте сервис загрузки изображений:
services.AddHttpClient<HttpImageUploader>();
Измените свой метод веб-действий, как показано ниже:
    public class SampleController : Controller
    {
        private HttpImageUploader _uploader;

        public SampleController(HttpImageUploader uploader)
        {
            this._uploader =  uploader;
        }

        [HttpPost]
        public async Task<ActionResult> SavePhoto([FromForm]IFormFile fileParameter)
        {
            var resp = await this._uploader.UploadAsync(fileParameter);
            return Json(resp); // now you get the response.
        }
    }
В качестве примечания вам, вероятно, потребуется изменить ImageTestController::ImageUpload, как показано ниже:
<strike>using (FileStream filestream = System.IO.File.Create("actualpath" + file.FileName))</strike>
using (FileStream filestream = System.IO.File.Create("actualpath/" + file.FileName))
{
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...