Контроллер WebAPI, который обрабатывает json для записи файла - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно написать api restfull с asp.net, который получает в теле json вроде:

"{
    \"name\" : \"name of the file\",
    \"path\" : \"path of the file\",
    \"body\" : \"body of th file\"
}"

и запишите файл на сервере с данными из этого json.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace tool_put.Controllers
{

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {      
        [HttpPost]
        public String Post([FromBody] string value)
        {
            dynamic obj = JsonConvert.DeserializeObject(value);
            String path = obj.path + obj.name + ".txt";
            //StreamWriter Data = new StreamWriter(MapPath("~/"+path), (System.Text.Encoding)true);
            // Data.WriteLine(obj.body);

            return "true";
        }
    }
}

Я использовал Visual Studio на Mac, и когда я запускаю это на localhost и пытаюсь выполнить http-сообщение от почтальона, файл, который не был создан. Обратите внимание, что он комментирует, потому что это решение с объектом StreamWriter не работает. Как можно решить это? Есть ли другой способ записать какой-нибудь текст в текстовый файл на сервере?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Если вы используете ядро ​​ASP.NET, я бы порекомендовал сделать следующее:

Создать DTO (объект передачи данных) и позволить инфраструктуре привязка модели обрабатывать сериализацию / десериализациюдля тебя.

public class FileDto
{
    public string Name { get; set; }
    public string Path { get; set; }
    public string Body { get; set; }
}

В Asp.Net Core нет эквивалента Server.MapPath.Чтобы получить корневой веб-путь, вы можете реализовать IHostingEnvironment как подробно здесь .

Однако в приведенном ниже примере просто используется жестко закодированное значение.Я бы рекомендовал вернуть IActionResult за ваш RESTful сервис.HttpPost должен возвращать ответ Created 201 в случае успеха.Приведенный ниже код вернет статус 201 Создано и файл DTO в теле ответа.

[HttpPost]
public IActionResult Post([FromBody] FileDto model)
{
    string directory = System.IO.Path.Combine(@"C:\temp\myfiles", model.Path);

    // TODO verify directory exists, Name is not null, Path is not null, Body is not null

    string fileName = model.Name + ".txt";
    string fullPath = System.IO.Path.Combine(directory, fileName);

    // simplest way to write to file
    System.IO.File.WriteAllText(fullPath, model.Body);

    return Created("http://url/to/your/new/file", model);
}

Если вы хотите добавить текст в существующий файл, вы можете использовать File.AppendAllText(path, text).

Путь, полученный API, может не существовать, вам нужно будет обработать случай, когда он не существует, и решить, что делать.Например, вы можете создать каталог или вернуть 404 NotFound или 500 ServerError.

Если вы не знаете, откуда поступают данные, разрешить клиентам / пользователям API выбирать / создавать путь к файлу, вероятно, не очень хорошая идея (что если пользователь / клиент отправил "path": "../.." для путинапример).

1 голос
/ 27 марта 2019

Вы можете использовать этот код для создания файла

 using(StreamWriter sw = File.AppendText("your path"))
 {

      sw.WriteLine("your text");                     

  }     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...