Я думаю, что гораздо лучше провести рефакторинг ваших 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
- Создайте клиентскую службу загрузки, как показано ниже:
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))
{
...