Search code examples
c#.netasp.net-apicontroller

.NET Core API - Return Image URL from Server and not from local storage


In Chrome i get following error:

Not allowed to load local resource: C://...

Now i want to change the return from the Image in like 'localhost:44346/wwwroot/images/profileimages/img.jpg'

Can you tell my how i can do this?

This is my Controller for the Fileupload:

    [HttpPut]
    [Authorize]
    [RequestSizeLimit(1_000_000)]
    [Route("UpdateImage")]
    public async Task<IActionResult> UpdateImage([FromForm]ApplicationUserModel model)
    {
        try
        {
            var user = await _userManager.FindByIdAsync(model.id);
            if (user.ProfileImagePath != null)
            {
                var file = new FileInfo(user.ProfileImagePath);
                file.Delete();
            }
            var uniqueFileName = GetUniqueFileName(model.ProfileImage.FileName);
            var uploads = Path.Combine(hostingEnvironment.WebRootPath, "Images\\ProfileImages");
            var filePath = Path.Combine(uploads, uniqueFileName);
            await model.ProfileImage.CopyToAsync(new FileStream(filePath, FileMode.Create));
            user.ProfileImagePath = filePath;

            var result = await _userManager.UpdateAsync(user);

            return Ok(result);

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

This is the Controller for getting the User Informations:

[HttpGet]
[Authorize]
[Route("GetCurrentUser")]
public async Task<IActionResult> GetCurrentUser()
{
    try
    {
        var userId = User.FindFirst("UserID")?.Value;
        var data = await _userManager.FindByIdAsync(userId);

        var user = new UserStandardModel
        {
            id = userId,
            LastName = data.LastName,
            FirstName = data.FirstName,
            ProfileImagePath = data.ProfileImagePath
        };


        return Ok(user);
    }
    catch (Exception ex)
    {

        throw ex;
    }
}

Solution

  • So i have found a solution for my problem. When i trigger my GetCurrentUser function than i will check i the FilePath starts with 'C'. When this is true i will format the filepath with my localhost address. Like Bruno suggested.

    But this works only if i have the UseStaticFiles() in my Startup.cs

        app.UseStaticFiles();
    

    This is not beautiful but it does the work and its only for testing.

            var userId = User.FindFirst("UserID")?.Value;
            var data = await _userManager.FindByIdAsync(userId);
    
            var user = new UserStandardModel
            {
                id = userId,
                LastName = data.LastName,
                FirstName = data.FirstName,
                ProfileImagePath = data.ProfileImagePath
            };
    
            if (user.ProfileImagePath.StartsWith('C'))
            {
                var url = "https://localhost:44356/";
                user.ProfileImagePath = user.ProfileImagePath.Remove(0,58);
                user.ProfileImagePath = url + user.ProfileImagePath;
                
            }
    
    
            return Ok(user);