Java >> Java Tutorial >  >> Tag >> Spring

So laden Sie Dateien mit Spring Boot hoch

In diesem Beitrag zeige ich, wie ich die Funktion zum Hochladen von Dateien in meine Spring Boot-Anwendung Social KPI hinzugefügt habe.

Am Rande sieht die Funktionalität sehr einfach aus und mit Spring Boot ist es tatsächlich einfach. Als Teil dieses Beitrags werden wir ein Webformular erstellen, in dem ein Administrator zusätzliche Benutzer für sein Unternehmen hinzufügt, indem er eine CSV-Datei in einem bestimmten Format importiert.

Die Grundfunktionalität besteht darin, einem Administrator eine Möglichkeit zu bieten, eine CSV-Datei zu importieren, die Daten zu lesen und zu validieren und sie bei korrekten Daten in der Datenbank zu speichern.

Nachdem wir nun unsere User Story definiert haben, fangen wir mit dem Beitrag an.

Formular zum Hochladen von Dateien in einer Spring Boot-Anwendung

Wir verwenden Thymeleaf-Vorlagen für unsere springbootbasierte Anwendung. Das Schreiben einer einfachen HTML-Seite mit einem Formular zum Hochladen einer Datei ist also sehr einfach, wie unten gezeigt:

<div class="container importuser">
    <div class="form-group">
    <form method="POST" th:action="@{/uploadUsers}" enctype="multipart/form-data">
        <input type="hidden" name="companyGuid" th:value="${companyGuid}"/>
        <input type="file" name="file"/></br></br>
        <button type="submit" class="btn btn-primary btn-lg" value="Import">Import
        </button>
    </form>
    </div>
</div>

Wie Sie in diesem Formular sehen, klicken Sie auf Import Schaltfläche startet die Aktion zum Hochladen von Benutzern.

Controller zum Handhaben des Datei-Uploads auf der Backend-Seite

Ein Controller, der die Funktionalität zum Hochladen von Benutzern handhabt, sieht wie folgt aus:

    @RequestMapping(value = "/uploadUsers",method= RequestMethod.POST)
    public String fileUpload (@RequestParam("file") MultipartFile file, @RequestParam(
            "companyGuid") String companyGuid,
                              RedirectAttributes redirectAttributes)
    {
        LOGGER.info("File is {}", file.getName());
        LOGGER.info("Company Guid is {}", companyGuid);

        if (file.isEmpty())
        {
            redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
            return "redirect:/uploadStatus";
        }

        List userList = FileUtil.readAndValidateFile(file, roleRepository);
        for(User user: userList)
        {
            User createdUser = userManager.createUser(companyGuid, user);
        }

        redirectAttributes.addFlashAttribute("message",
                "You successfully uploaded " + file.getOriginalFilename() + " and added " + userList.size() + " users");


        return "redirect:/uploadStatus";
    }

Die Methode zu readAndValidateFile liest einfach die Daten aus der Datei und validiert, um sicherzustellen, dass alle Felder in der CSV-Datei vorhanden sind. Wenn das falsche Format vorliegt, wird ein Fehler ausgegeben. Wenn es sich um eine gültige Datei handelt, wird eine Benutzerliste erstellt. UserManager erstellt jeden Benutzer.

Die Klasse FileUtil ist wie folgt:

package com.betterjavacode.socialpie.utils;

import com.betterjavacode.socialpie.models.Role;
import com.betterjavacode.socialpie.models.User;

import com.betterjavacode.socialpie.repositories.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FileUtil
{
    private static final String FIRST_NAME = "firstname";
    private static final String LAST_NAME = "lastname";


    public static List readAndValidateFile (MultipartFile file, RoleRepository roleRepository)
    {
        BufferedReader bufferedReader;
        List result = new ArrayList<>();
        try
        {
            String line;
            InputStream inputStream = file.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            while((line = bufferedReader.readLine()) != null)
            {
                String[] userData = line.split(",");
                if(userData == null || userData.length != 5)
                {
                    throw new RuntimeException("File data not in correct format");
                }
                if(FIRST_NAME.equalsIgnoreCase(userData[0]) && LAST_NAME.equalsIgnoreCase(userData[2]))
                {
                    continue; // first line is header
                }
                User user = new User();
                user.setFirstName(userData[0]);
                user.setMiddleName(userData[1]);
                user.setLastName(userData[2]);
                user.setEmail(userData[3]);
                Role role = roleRepository.findByRoleName(userData[4]);
                user.setRole(role);
                result.add(user);
            }
        }
        catch(IOException e)
        {
            throw new RuntimeException("Unable to open the file " + e.getMessage());
        }
        return result;
    }
}

Eine funktionierende Demo

Sobald ich mich bei der Anwendung Social KPI anmelde, klicke ich auf Add Users und ich muss den Benutzerbildschirm hochladen, der unten aussieht:

Benutzer importieren

Nachdem Sie eine Datei im CSV-Format zum Hochladen ausgewählt haben, klicken Sie auf Import , wird der folgende Bildschirm angezeigt:

Datei-Upload-Status

Schlussfolgerung

In diesem Beitrag haben wir gezeigt, wie Sie eine Datei importieren, während Sie das mehrteilige Spring Boot-Formular verwenden.

Referenzen

  1. Hochladen von Dateien – Hochladen von Dateien

Java-Tag