ホームページ >Java >&#&チュートリアル >Spring Boot を通じてファイルおよびストレージ サービスを実装する方法

Spring Boot を通じてファイルおよびストレージ サービスを実装する方法

PHPz
PHPzオリジナル
2023-06-22 12:26:30986ブラウズ

インターネット技術の発展に伴い、ファイルおよびストレージ サービスはさまざまなアプリケーションに必要な部分になりましたが、エンタープライズ レベルの Java アプリケーションを迅速に構築するためのフレームワークである Spring Boot には、ファイル サービスおよびストレージ サービスの実現においても独自の利点があります。 。この記事では、Spring Boot を通じてファイルおよびストレージ サービスを実装する方法を紹介します。

1. Spring Boot でのファイル処理

Spring Boot は、一連のファイル処理メソッドを提供しており、Spring の Resource および ResourceLoader インターフェイスを通じて、ローカル ファイル、クラスパス下のファイル、ネットワーク リソースなどを取得できます。 。

1.1 ローカル ファイル操作

Spring Boot 開発プロセスでは、ResourceLoader インターフェイスの getResource メソッドを使用して、指定されたファイルの Resource オブジェクトを取得します。コード例は次のとおりです。 ##

@ResourceLoader
ResourceLoader resourceLoader;

File file = new File("D:/image.jpg"); //指定文件路径(绝对路径)
Resource resource = resourceLoader.getResource("file:" + file.getAbsolutePath()); //获取文件Resource对象
InputStream inputStream = resource.getInputStream(); //获取文件输入流

このうち、ResourceLoader は Spring が提供するリソースローダーインターフェースで、@ResourceLoader アノテーションを付けることで Autowired 経由で実装クラスのインスタンスを自動的に注入することができます。 getResource() メソッドは、指定されたファイル パスの Resource オブジェクトを取得するために使用されます。ここでは、「file:」プロトコルを通じて絶対パスを指定します。

1.2 クラスパスファイルの操作

Spring Boot アプリケーションでは、Web プロジェクトに関連するリソース ファイル (構成ファイルなど) をクラスパス下に配置し、ClassPathResource を通じてリソース参照を取得できます。コード例は次のとおりです:

ClassPathResource classPathResource = new ClassPathResource("config.properties"); //获取配置文件Resource对象
InputStream inputStream = classPathResource.getInputStream(); //获取配置文件输入流

ClassPathResource クラスは、アプリケーション クラス パスからリソースをロードするときに、「classpath:」や「file:」などのファイル システム プレフィックスをサポートします。このコードは、それが指定されていない場合の動作を示しています。パスの接頭辞「file:」は、ファイル システムの接頭辞に関係します。

1.3 ネットワーク ファイル操作

ローカル パスとクラスパス パス内のファイルに加えて、Spring Boot は URLResource オブジェクトを通じてネットワーク上のファイルを操作することもできます。コード例は次のとおりです:

String url = "http://img.iplaysoft.com/wp-content/uploads/2019/free-images/free_stock_photo.jpg";
Resource resource = new UrlResource(url); //获取网络资源Resource对象
InputStream inputStream = resource.getInputStream(); //获取网络资源输入流

このうち、UrlResource クラスはネットワークからリソース ファイルを取得でき、ネットワーク アドレス URL をコンストラクターのパラメーターとして渡す必要があります。

2. Spring Boot でのファイルのアップロード

実際の Spring Boot アプリケーション開発では、ファイルのアップロードが一般的な要件であり、Spring Boot では MultipartFile クラスと MultipartResolver パーサーを使用してファイルのアップロードを完了できます。手術。

2.1 MultipartFile クラス

Spring の MultipartFile クラスは、1 つ以上のファイルをアップロードするためのシンプルかつ一貫した方法を提供します。これは、@RequestParam アノテーションの下で使用される MVC 処理メソッドのパラメーター タイプです。次のようなものです。

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    //具体文件上传操作
    return "success";
}

ファイルをアップロードするときは、特定のアップロード操作を指定し、ファイルの保存パスとその他の関連パラメーターを設定する必要があります。

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    // 获取文件名
    String fileName = file.getOriginalFilename();
    // 设置保存路径
    String filePath = "D:/upload/";
    File dest = new File(filePath + fileName);
    try {
        file.transferTo(dest);
        // 具体业务操作
        return "success";
    } catch (IOException e) {
        e.printStackTrace();
        return "failure";
    }
}

2.2 MultipartResolver Parser

MultipartResolver は Spring MVC フレームワークのインターフェースであり、POST リクエスト内のファイル アップロード データを解析するために使用されます。 Spring Boot では、組み込みの CommonsMultipartResolver クラスを使用して、ファイル アップロードの解析操作を実装できます。 Spring Boot プロジェクトでは、Spring 構成ファイルで MultipartResolver オブジェクトを構成するだけで済みます。具体的なコード例は次のとおりです:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }
}

この例では、CommonsMultipartResolver クラス インスタンスを構成し、アップロードされるファイルの最大サイズを制限します1,000,000バイトまで。 @EnableWebMvc を有効にして Spring MVC 適応動作を有効にし、CommonsMultipartResolver クラス インスタンスが正しく動作できるようにする必要があることに注意してください。

3. Spring Boot でのファイルのダウンロード

Spring Boot アプリケーション開発では、ファイルのダウンロードも一般的な要件です。 Spring Boot は、対応するステータス コード、ヘッダー、本文を含む HTTP 応答全体を表す ResponseEntity を提供します。 Content-Disposition を設定することで、ダウンロード ファイルの名前と種類を指定できます。

3.1 ファイル ダウンロードの実装

@ResponseBody アノテーションを使用して、メソッドによって返されたバイト配列で表されるファイル コンテンツを処理し、ResponseEntity を使用して HTTP 応答本文全体を返すことができます。

@GetMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
    String filePath = "D:/image.jpg";
    File file = new File(filePath);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Disposition", "attachment;filename=" + file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    byte[] bytes = FileUtils.readFileToByteArray(file);
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    return responseEntity;
}

上記のコードでは、FileUtils を使用してファイルをバイト配列として読み取り、その配列を HttpEntity に設定して返します。返された HttpEntity では、クライアント ブラウザがダウンロード ウィンドウにこの情報を表示できるように、ファイルの名前と種類も指定します。

3.2 複数ファイルのダウンロードの実装

場合によっては、複数のファイルをダウンロードする必要がある場合、複数のファイルを 1 つの zip ファイルにパッケージ化して、複数のファイルのダウンロードを実現できます。 Spring Boot では、java.util.zip パッケージで提供される ZipOutputStream クラスを使用して zip ファイル操作を簡単に実装できます。コード例は次のとおりです:

@GetMapping("/download_multi")
public ResponseEntity<byte[]> downloadMulti() throws IOException {
    String base = "D:/test/";
    File directoryToZip = new File(base);
    List<File> fileList = new ArrayList<>();
    getAllFiles(directoryToZip, fileList);
    byte[] zipBytes = getZipBytes(fileList, base);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.add("Content-Disposition", "attachment; filename="files.zip"");
    headers.setContentLength(zipBytes.length);
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(zipBytes, headers, HttpStatus.OK);
    return responseEntity;
}

private byte[] getZipBytes(List<File> fileList, String basePath) throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
    for (File file : fileList) {
        String filePath = file.getAbsolutePath().substring(basePath.length());
        ZipEntry zipEntry = new ZipEntry(filePath);
        zipOutputStream.putNextEntry(zipEntry);
        FileInputStream inputStream = new FileInputStream(file);
        IOUtils.copy(inputStream, zipOutputStream);
        inputStream.close();
        zipOutputStream.closeEntry();
    }
    zipOutputStream.close();
    byte[] bytes = outputStream.toByteArray();
    outputStream.close();
    return bytes;
}

private void getAllFiles(File dir, List<File> fileList) {
    File[] files = dir.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            getAllFiles(file, fileList);
        } else {
            fileList.add(file);
        }
    }
}

上記のコードでは、ZipOutputStream クラスを使用しますおよび ByteArrayOutputStream を使用して、複数のファイルを 1 つの zip ファイルにパッケージ化し、ZIP ファイルのバイト配列、ファイル名、タイプを含む HTTP 応答本文全体を ResponseEntity を通じて返します。これにより、クライアントのブラウザーはこの情報をダウンロード ウィンドウに表示できます。

4. Spring Boot のファイル ストレージ

実際のアプリケーションでは、ファイル ストレージも重要なリンクです。ファイルはローカル、FTP、オブジェクト ストレージなどさまざまな場所に保存できますが、ここではローカル ストレージを例に、Spring Boot によるファイル ストレージの実装方法を紹介します。

4.1 ストレージ ディレクトリの作成

まず、ストレージ サービス用のディレクトリを作成する必要があります。コード例は次のとおりです:

String fileRoot = "/data/files/";
Path rootPath = Paths.get(fileRoot).normalize().toAbsolutePath();
if (!Files.exists(rootPath)) {
    Files.createDirectories(rootPath);
}

上記のコードでは、 create a root directory/ data/files/ はファイルの保存に使用され、ディレクトリが存在するかどうかを確認し、存在しない場合は作成します。

4.2 实现文件存储服务

在Spring Boot中,实现文件存储服务也非常简单,我们可以创建一个类实现存储服务接口,具体代码示例如下:

@Service
public class FileStorageService {

    private Path fileStorageLocation;

    @Autowired
    public FileStorageService(@Value("${file.upload-dir}") String fileRoot) {
        this.fileStorageLocation = Paths.get(fileRoot).normalize().toAbsolutePath();
        try {
            Files.createDirectories(this.fileStorageLocation);
        } catch (Exception e) {
            throw new FileStorageException("Could not create the directory where the uploaded files will be stored.", e);
        }
    }

    public String storeFile(MultipartFile file) {
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        try {
            if (fileName.contains("..")) {
                throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
            }
            Path targetLocation = this.fileStorageLocation.resolve(fileName);
            Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
            return fileName;
        } catch (IOException ex) {
            throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);
        }
    }

    public Resource loadFileAsResource(String fileName) {
        try {
            Path filePath = this.fileStorageLocation.resolve(fileName).normalize();
            Resource resource = new UrlResource(filePath.toUri());
            if (resource.exists()) {
                return resource;
            } else {
                throw new MyFileNotFoundException("File not found " + fileName);
            }
        } catch (MalformedURLException ex) {
            throw new MyFileNotFoundException("File not found " + fileName, ex);
        }
    }
}

上述代码中,我们创建了一个FileStorageService类,用于实现文件存储服务,包含storeFile()和loadFileAsResource()两个方法,其中:

storeFile()方法用于存储上传的文件,可以获取文件的输入流,将文件存储到指定的存储目录中;

loadFileAsResource()方法用于加载指定文件的Resource对象,通过提供的文件名获取文件的Resource对象。

注意,我们使用@Autowired注解注入了config.properties中对应的配置文件路径,使其自动配置为文件存储的目录。

结语

通过Spring Boot的文件和存储服务,我们可以轻松实现文件操作、上传、下载和存储等操作,简单高效,可以应用于各类企业级Java应用。希望本文对大家对Spring Boot文件和存储服务的理解和实践有所帮助。

以上がSpring Boot を通じてファイルおよびストレージ サービスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。