Рубрики
Без рубрики

Изображение / Файл Загрузка в Adonis.js с county

Итак, на этой неделе на работе на работе коллега поболтал со мной на том, чтобы положить то, что он научился использовать (связанные с Android), но нуждался в небольшом API для работы. Моя начальная мысль делает это …

Автор оригинала: Abeeb Amoo.

Итак, на этой неделе на работе на работе коллега поболтал со мной на том, чтобы положить то, что он научился использовать (связанные с Android), но нуждался в небольшом API для работы. Моя начальная мысль делала это Express.js. Через несколько часов назад я понял, что мне нужно было работать с загрузкой изображения и как обычное обладание для спасения. На полпути, я застрял, но не мог найти много помощи, поэтому я решил написать это, как только я закончил. Этот пост предполагает, что вы уже используете Adonis (вероятно, влюблен в него), поэтому я не пойду пытаться проповедовать вам Adonis (вы все равно можете проверить здесь, чтобы начать работу). В этом посте мы создадим сообщение с прикрепленным изображением и загруженным изображением для Peouliary. Во-первых, давайте создадим новое приложение с

Adonis New Postapp.

Затем CD в каталог проекта и запустите команду ниже

Адонис подают –dev.

Если все прошло хорошо, приложение должно быть подано в порту 3333. Посещение http://127.0.0.1:3333, мы должны увидеть страницу ниже

1 * glanvcteqbdwkyqmqrvvhg.png.

Большой! Так, что дальше? Помните, что Adonis – это Framework MVC для Node.js Да? Итак, давайте начнем положить компоненты нашего небольшого приложения вместе. Давайте начнем с миграции. Для этого учебника мы будем использовать базу данных MySQL. Итак, давайте сначала установим MySQL, запустив

NPM установить mysql –save

После установки нам нужно сделать Adonis в наших настройках базы данных. Открыть .env Файл и обновите элементы ниже, устанавливая значения в свои собственные учетные данные базы данных.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=
DB_DATABASE=adonis

Обратите внимание, что по умолчанию db_connection in adonis – sqlite. Обязательно измените его в MySQL, как указано выше.

Далее мы создаем файл миграции для проведения наших постов таблицы. Стол столба должен содержать ID, название, тело Image_URL и Timestamps Отказ Запустите следующую команду, чтобы создать миграцию.

Adonis Make: Миграция

При появлении запроса выберите параметр «Создать таблицу», чтобы создать новую таблицу и нажмите Enter. Вновь созданный файл миграции можно найти в База данных/миграции каталог. Поскольку мы не будем нуждаться в существующих таблицах, давайте удалим две файлы миграции по умолчанию, уже созданные Adonis – таблице пользователей и таблицей токенов. Обновите посты миграции на один ниже

up () {
  this.create('posts', (table) => {
    table.increments();
    table.string('title');
    table.text('body');
    table.string('image_url').nullable();
    table.timestamps()
  })
}

С этим мы можем провести нашу миграцию с

Миграция Adonis: Run

Как только миграция успешно запустится, мы можем затем создать нашу почтовую модель с

Адонис делает: модель пост

Приведенное выше создает нашу модель в каталоге приложения/моделей

Теперь давайте обновим наш маршрут соответствующим образом. Маршруты можно найти в начале/маршрутах. Джей, тогда мы можем обновить маршруты, как показано ниже

const Route = use('Route');

Route.get('/', 'PostController.index');
Route.post('/', 'PostController.create');

Далее мы создаем PostController с

Adonis Make: Controller Post

При появлении запроса выберите HTTP Restells и нажмите Enter. Контроллер можно найти в каталоге App/Controllers/HTTP. Теперь, когда у нас есть настройка нашего контроллера, давайте создадим необходимые методы. На данный момент наш постконтроллер должен выглядеть так

'use strict';

const Post = use('App/Models/Post');

class PostController {

  async index( {view}) {
    const posts = await Post.all();
    return view.render('index', {posts: posts.toJSON()})
  }

  async create( {request, response, view}) {
    
  }
}

module.exports = PostController;

Давайте создадим пользовательский интерфейс для нашего маленького приложения сейчас. Нам понадобится два файла, чтобы держать наши взгляды. Один для главного макета и другого, чтобы держать наши посты. Давайте создадим эти два файла с

Adonis Make: просмотр мастера

а также

Adonis Make: Просмотр индекса

Представления можно найти в каталоге ресурсов/просмотров. Файл Master.Edge – это базовый макет и распространяется на индекс. Мастер-макет содержит следующее





  
  
  
  Posts App
  
  
  
  {{style('style.css')}}
  


  
@!section('content')

В Index.Edge форма представлена в виде модального загрузки, как показано ниже

@layout('master')

@section('content')



@endsection

Не забывайте добавленные в форму, поскольку мы отправляем файл на сервер.

Далее – обработать файл на сервере. Давайте установим библиотеку Vectorial Node.js, запустив

NPM установить Petouthary –Save

Затем зарегистрируйтесь на Countrary, если у вас нет учетной записи еще или если у вас уже есть аккаунт, скопируйте свои учетные данные FRO Dashboard и вставьте в свой .env как ниже

CLOUDINARY_API_KEY = 
CLOUDINARY_API_SECRET = 
CLOUDINARY_CLOUD_NAME = 

Далее создайте файл cloudaryservice.js в каталоге приложений/сервисов, чтобы держать наш облачный конфиг. Файл Cloudaryservice.js должен иметь в нем следующее

const cloudinary = require('cloudinary');
const Env = use('Env');

cloudinary.config({
  cloud_name: Env.get('CLOUDINARY_CLOUD_NAME'),
  api_key: Env.get('CLOUDINARY_API_KEY'),
  api_secret: Env.get('CLOUDINARY_API_SECRET')
});

module.exports = cloudinary;

Если вы попытаетесь отправить форму сейчас, вы, скорее всего, получите ошибку несоответствия токена CSRF, как ниже

1 * ffzuf3wa21fuyzbvaysckw.png.

Это связано с тем, что флажка токена не работает с Multipart/Form-data. Обходной путь для этого должен перейти к конфигурации/Shield.js и добавить URL в FilterUris в клавише CSRF, как ниже. Это предотвращает промежуточную программу токена на этом маршруте.

csrf: {
  enable: true,
  methods: ['POST', 'PUT', 'DELETE'],
  filterUris: ['/'],
  cookieOptions: {
    httpOnly: false,
    sameSite: true,
    path: '/',
    maxAge: 7200
  }
}

Далее, давайте обработаем форму на бэкэнде, обновляя метод создания в PostController, чтобы иметь фрагмент ниже

'use strict';

const Post = use('App/Models/Post');
const CloudinaryService = use('App/Services/CloudinaryService');

class PostController {

  async index( {view}) {
    const posts = await Post.all();
    return view.render('index', {posts: posts.toJSON()})
  }

  async create( {request, response, session}) {
    const {title, body} = request.all();
    const file = request.file('image');
    try {
      const cloudinaryResponse = await CloudinaryService.v2.uploader.upload(file.tmpPath, {folder: 'postsapp'});
      let post = new Post();
      post.title = title;
      post.body = body;
      post.image_url = cloudinaryResponse.secure_url;
      await post.save();
      session.flash({success: 'Successfully added post'});
      return response.redirect('back');
    } catch (e) {
      session.flash({error: 'Error Uploading Image'});
      return response.redirect('/')
    }
  }
}

module.exports = PostController;

Обратите внимание на V2 и {папка: «PostApp»}, добавленные в облачность, чтобы убедиться, что изображения загружаются в папку.

Наконец, давайте обновим index.gee, чтобы отобразить сообщения и уведомления и сделать небольшой стиль. Стайлинг находится в Public/style.css.

@if(old('success'))
{{old('success')}}
@elseif(old('error'))
{{old('error')}}
@endif
@each(post in posts)
{{post.title}}

{{post.body}}
@endeach

Still.css

body, html {
  background: #efefef;
}

.wrapper {
  padding: 50px;
}

.card {
  box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
  background: #ffffff;
  padding: 20px;
  transition: 0.3s;
}

.card .title {
  font-weight: bold;
}

.notifications {
  padding-top: 30px;
}

.posts-wrapper {
  padding-top: 20px;
}

.post-body {
  padding-top: 10px;
}

.single-post-wrapper {
  height: 350px;
}

Тестирование нашего небольшого приложения, мы должны иметь что-то вроде того, что показано ниже

1 * 1F-5G91C-WQACU1LRY6RTA.GIF

Вот и все! У нас есть наше рабочее приложение с функцией загрузки изображений.