最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能

 更新時(shí)間:2024年07月20日 08:40:53   作者:JavaEdge.  
在做項(xiàng)目時(shí),后端經(jīng)常采用上傳文件組件MultipartFile,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在Web開發(fā)中,文件上傳是一個(gè)常見的功能需求。Spring框架提供了MultipartFile接口,用于處理文件上傳請求。MultipartFile可以代表一個(gè)多部分文件上傳請求中的一個(gè)文件,提供了一系列方法用于獲取文件的各種屬性和內(nèi)容,使得在后端處理文件上傳變得十分方便。下面我們將介紹MultipartFile在Web應(yīng)用中的幾種常見使用場景。

1. 圖片上傳

在Web應(yīng)用中,圖片上傳是一種常見的場景。用戶需要上傳頭像、相片、證件照等圖片文件,而后端需要接收并保存這些文件。使用MultipartFile接口可以輕松地實(shí)現(xiàn)圖片文件的接收和處理。通過獲取文件的原始文件名、內(nèi)容類型、大小等屬性,我們可以實(shí)現(xiàn)對圖片文件的有效管理和存儲。例如,我們可以將圖片文件保存到服務(wù)器的文件系統(tǒng)中,或者將其存儲到云存儲服務(wù)中。

2. 文件下載

除了文件上傳,文件下載也是Web應(yīng)用中常見的功能需求。使用MultipartFile接口,我們可以實(shí)現(xiàn)文件的下載功能。在服務(wù)器端,我們可以將文件作為MultipartFile對象進(jìn)行處理,并通過設(shè)置響應(yīng)頭信息,將文件作為下載內(nèi)容返回給客戶端。客戶端接收到文件后,可以將其保存到本地磁盤或進(jìn)行其他處理。

3. 文件編輯

在Web應(yīng)用中,有時(shí)候用戶需要對上傳的文件進(jìn)行編輯操作,例如修改文件名、修改文件內(nèi)容等。使用MultipartFile接口,我們可以實(shí)現(xiàn)對文件的編輯功能。首先,我們可以通過MultipartFile接口獲取上傳的文件對象,然后對其進(jìn)行相應(yīng)的編輯操作。例如,我們可以修改文件的名稱、修改文件的內(nèi)容等。編輯完成后,我們可以將修改后的文件保存到服務(wù)器或返回給客戶端。

4. 文件預(yù)覽和展示

在Web應(yīng)用中,有時(shí)候我們需要將上傳的文件進(jìn)行預(yù)覽或展示。例如,在文檔管理系統(tǒng)中,用戶需要預(yù)覽或下載文檔文件。使用MultipartFile接口,我們可以實(shí)現(xiàn)文件的預(yù)覽和展示功能。我們可以將文件作為MultipartFile對象進(jìn)行處理,然后將其內(nèi)容轉(zhuǎn)換為適當(dāng)?shù)母袷竭M(jìn)行展示。例如,對于PDF文件,我們可以使用PDF閱讀器插件進(jìn)行展示;對于圖片文件,我們可以將其直接展示在網(wǎng)頁上。

5. 文件批量上傳和處理

在實(shí)際應(yīng)用中,有時(shí)候用戶需要批量上傳多個(gè)文件,并對這些文件進(jìn)行處理。使用MultipartFile接口,我們可以實(shí)現(xiàn)文件的批量上傳和處理功能。我們可以將多個(gè)文件作為一個(gè)多部分文件上傳請求進(jìn)行處理,然后對每個(gè)文件進(jìn)行相應(yīng)的操作。例如,我們可以將多個(gè)圖片文件批量上傳到服務(wù)器,并對它們進(jìn)行壓縮、裁剪等處理。

代碼

package com.javagpt.back.controller;

import com.javagpt.application.context.UserAppContextHolder;
import com.javagpt.application.file.FileApplicationService;
import com.javagpt.application.file.FileDTO;
import com.javagpt.common.annotation.RespSuccess;
import com.javagpt.common.constant.EMConstant;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Api(tags = "文件接口")
@Slf4j
@RestController
@RequestMapping(EMConstant.API_V1 + "/file")
@RespSuccess
@RequiredArgsConstructor
public class FileController {

    private final FileApplicationService fileApplicationService;

    @ApiOperation("通用文件上傳")
    @PostMapping(value = "/uploadFile")
    public FileDTO uploadFile(@RequestParam("file") MultipartFile multipartFile) throws IOException {
        Long enterpriseId = UserAppContextHolder.getCurrentUser().getEnterpriseId();
        FileDTO fileDTO = fileApplicationService.saveFile(enterpriseId, multipartFile);
        return fileDTO;
    }

    //@PreAuthorize("hasAuthority('mp:file:download')")
    @ApiOperation("下載文件")
    @GetMapping(value = "/downloadFile")
    public void download(@RequestParam(value = "id") Long id, HttpServletResponse response) throws IOException {
        fileApplicationService.downloadFile(response, id, UserAppContextHolder.getCurrentUser().getEnterpriseId());
    }

    @ApiOperation("查看文件信息")
    @GetMapping(value = "/info")
    public FileDTO fileInfo(@RequestParam(value = "id") Long id) throws IOException {
        return fileApplicationService.findById(id);
    }

    @ApiOperation("下載視頻")
    @GetMapping(value = "/downloadFile2")
    public void download2(@RequestParam(value = "id") Long id, HttpServletRequest request, HttpServletResponse response) throws IOException {
        fileApplicationService.downloadVideo(request, response, id, UserAppContextHolder.getCurrentUser().getEnterpriseId());
    }
}
package com.javagpt.application.file;

import com.javagpt.common.exception.BusinessRuntimeException;
import com.javagpt.common.oos.OssService;
import com.javagpt.common.util.ModelUtils;
import com.javagpt.common.util.SpringResponseUtils;
import com.javagpt.file.entity.FileEntity;
import com.javagpt.file.repository.FileRepository;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

@Service
@Slf4j
@RequiredArgsConstructor
public class FileApplicationService {

    private final OssService ossService;

    private final FileRepository fileRepository;


    public FileDTO findById(Long id) {
        FileEntity fileEntity = fileRepository.findById(id);
        return ModelUtils.convert(fileEntity, FileDTO.class);
    }

    @Transactional
    public FileDTO saveFile(Long enterpriseId, MultipartFile file) {
        FileEntity fileEntity = saveFile(enterpriseId, file, null);
        return ModelUtils.convert(fileEntity, FileDTO.class);
    }

    @Transactional
    public FileEntity saveFile(Long enterpriseId, MultipartFile file, String fileName) {
        String originalFilename = file.getOriginalFilename();
        String name = StringUtils.isBlank(fileName) ? FilenameUtils.getBaseName(originalFilename) : fileName;
        String suffix = FilenameUtils.getExtension(originalFilename);
        long size = file.getSize();
        FileEntity fileEntity = new FileEntity();
        fileEntity.setName(name).setSuffix(suffix).setSize(size).setEnterpriseId(enterpriseId);
        fileEntity = fileEntity.save();
        String key = fileEntity.getPath();
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            log.error("saveFile error:", e);
            throw BusinessRuntimeException.error("上傳文件失敗");
        }
        ossService.uploadFile(inputStream, key);
        IOUtils.closeQuietly(inputStream);
        return fileEntity;
    }


    @Transactional
    public FileEntity saveFile(File file) {
        long size = file.length();
        FileEntity fileEntity = new FileEntity();
        String baseName = FilenameUtils.getBaseName(file.getName());
        String extension = FilenameUtils.getExtension(file.getName());
        fileEntity.setName(baseName).setSuffix(extension).setSize(size);
        fileEntity = fileEntity.save();
        String key = fileEntity.getPath();
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            ossService.uploadFile(inputStream, key);
        } catch (FileNotFoundException e) {
            log.error("saveFile error:", e);
            throw BusinessRuntimeException.error("上傳文件失敗");
        }
        IOUtils.closeQuietly(inputStream);
        return fileEntity;
    }


    public void downloadFile(HttpServletResponse response, Long fileId, Long enterpriseId) throws IOException {
        FileEntity fileEntity = fileRepository.findById(fileId);
        if (fileEntity == null) {
            throw BusinessRuntimeException.error("無效的文件Id");
        }
        String key = fileEntity.getPath();
        InputStream inputStream = ossService.downloadFile(key);
        SpringResponseUtils.writeAndFlushResponse(inputStream, response, fileEntity.fileFullName());
    }


    public void downloadVideo(HttpServletRequest request, HttpServletResponse response, Long fileId, Long enterpriseId) throws IOException {

        FileEntity fileEntity = fileRepository.findById(fileId);
        if (fileEntity == null) {
            throw BusinessRuntimeException.error("無效的文件Id");
        }
        response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
        Long fileSize = fileEntity.getSize();
        long start = 0, end = fileSize - 1;
        //判斷前端需不需要分片下載
        if (StringUtils.isNotBlank(request.getHeader("Range"))) {
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
            String numRange = request.getHeader("Range").replaceAll("bytes=", "");
            String[] strRange = numRange.split("-");
            if (strRange.length == 2) {
                start = Long.parseLong(strRange[0].trim());
                end = Long.parseLong(strRange[1].trim());
                //若結(jié)束字節(jié)超出文件大小 取文件大小
                if (end > fileSize - 1) {
                    end = fileSize - 1;
                }
            } else {
                //若只給一個(gè)長度  開始位置一直到結(jié)束
                start = Long.parseLong(numRange.replaceAll("-", "").trim());
            }
        }
        long rangeLength = end - start + 1;
        String contentRange = new StringBuffer("bytes ").append(start).append("-").append(end).append("/").append(fileSize).toString();
        response.setHeader(HttpHeaders.CONTENT_RANGE, contentRange);
        response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(rangeLength));
        String key = fileEntity.getPath();
        InputStream inputStream = ossService.downloadFile2(key, start, end);
        SpringResponseUtils.writeAndFlushResponse(inputStream, response, fileEntity.fileFullName());
    }
}

總之,MultipartFile接口在Web應(yīng)用中具有廣泛的應(yīng)用場景,可以實(shí)現(xiàn)文件上傳、下載、編輯、預(yù)覽和批量處理等功能。通過熟練掌握MultipartFile接口的使用方法和技巧,我們可以更加高效地處理文件上傳和下載請求,提升Web應(yīng)用的用戶體驗(yàn)和功能性能。

總結(jié)

到此這篇關(guān)于如何基于SpringWeb MultipartFile實(shí)現(xiàn)文件上傳、下載功能的文章就介紹到這了,更多相關(guān)SpringWeb MultipartFile文件上傳下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java利用位運(yùn)算實(shí)現(xiàn)比較兩個(gè)數(shù)的大小

    Java利用位運(yùn)算實(shí)現(xiàn)比較兩個(gè)數(shù)的大小

    這篇文章主要為大家介紹了,在Java中如何不用任何比較判斷符(>,==,<),返回兩個(gè)數(shù)( 32 位整數(shù))中較大的數(shù),感興趣的可以了解一下
    2022-08-08
  • Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案

    Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案

    這篇文章主要介紹了Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • idea?http?request無法識別環(huán)境變量的解決步驟

    idea?http?request無法識別環(huán)境變量的解決步驟

    AlibabaCloudToolkit插件安裝后在?Editor->File?Types增加?AlibabaCloudROStemplates(JSON)項(xiàng)且會配置為解析*.json?文件,導(dǎo)致http?client無法正確解析http-client.env.json文件而無法讀取環(huán)境變量,本文介紹idea?http?request無法識別環(huán)境變量問題,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)月餅的制作、下單和售賣功能

    Java實(shí)現(xiàn)月餅的制作、下單和售賣功能

    這篇文章主要介紹了Java實(shí)現(xiàn)月餅的制作、下單和售賣,借此機(jī)會,我們用Lambda實(shí)現(xiàn)一遍月餅制作,下單,售賣的開發(fā)設(shè)計(jì)模式,主要有制作月餅的工廠模式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱的實(shí)現(xiàn)代碼

    springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱的實(shí)現(xiàn)代碼

    在Redis中客戶端可以通過訂閱特定的頻道來接收發(fā)送至該頻道的消息,本文主要介紹了springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Java中的值傳遞和引用傳遞區(qū)別解析

    Java中的值傳遞和引用傳遞區(qū)別解析

    這篇文章主要介紹了Java中的值傳遞和引用傳遞區(qū)別解析,引用類型的變量保存引用值,“引用值”指向內(nèi)存空間的地址,代表了某個(gè)對象的引用,而不是對象本身,對象本身存放在該引用值所表示的地址的位置,包含:數(shù)組、類、接口,需要的朋友可以參考下
    2023-11-11
  • Spring boot如何開啟跨域配置

    Spring boot如何開啟跨域配置

    這篇文章主要介紹了Spring boot如何開啟跨域配置問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JDBC獲取數(shù)據(jù)庫連接由淺入深

    JDBC獲取數(shù)據(jù)庫連接由淺入深

    大家好,本篇文章主要講的是JDBC獲取數(shù)據(jù)庫連接由淺入深,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • mybatis?查詢方式與效率高低對比

    mybatis?查詢方式與效率高低對比

    這篇文章主要介紹了mybatis?查詢方式與效率高低對比,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的方法

    Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論

修文县| 棋牌| 孟津县| 定日县| 东山县| 彰化市| 荔浦县| 自治县| 大渡口区| 建平县| 维西| 青铜峡市| 漳平市| 宜黄县| 巴林右旗| 西乌珠穆沁旗| 苏州市| 洱源县| 那坡县| 堆龙德庆县| 元谋县| 信阳市| 社旗县| 南城县| 犍为县| 盐山县| 清流县| 湘潭市| 红安县| 金堂县| 江安县| 来安县| 全南县| 微山县| 柳林县| 福建省| 海口市| 朝阳县| 宁陕县| 澄城县| 玉山县|