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

Java實現(xiàn)文件上傳到服務(wù)器本地并通過url訪問的方法步驟

 更新時間:2023年04月17日 12:03:55   作者:cavs-coder  
最近項目中使用到了文件上傳到服務(wù)器的功能,下面這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)文件上傳到服務(wù)器本地并通過url訪問的方法步驟,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、場景

Java實現(xiàn)文件上傳到服務(wù)器本地,并通過url訪問

有個需求,前端上傳文件,需要用開關(guān)的方式同時支持上傳七牛和服務(wù)器本地,方便不同的用戶需求合理分配資源。本篇主要介紹文件上傳到本地,然后通過url訪問。

二、SpringBoot默認(rèn)靜態(tài)資源訪問方式

首先想到的就是可以通過SpringBoot通常訪問靜態(tài)資源的方式,當(dāng)訪問:項目根路徑 + / + 靜態(tài)文件名時,SpringBoot會依次去類路徑下的四個靜態(tài)資源目錄下查找(默認(rèn)配置)。

在資源文件resources目錄下建立如下四個目錄:

重啟Spring boot,訪問

http://localhost:8080/1.jpg
http://localhost:8080/2.jpg
http://localhost:8080/3.jpg
http://localhost:8080/4.jpg

結(jié)果:

三、上傳的文件應(yīng)該存儲在哪?怎么訪問?

1.文件存儲在哪?

前文所說外部用戶可通過url訪問服務(wù)器資源文件resources目錄下的靜態(tài)資源,但若是將上傳的文件都保存在resources相關(guān)目錄下,將會導(dǎo)致后續(xù)打包過大,程序和代碼不分離,無法查看等問題。

解決方案:文件上傳到服務(wù)器某個目錄,然后SpringBoot配置虛擬路徑,映射到此目錄。

2.怎么訪問?

通過WebMvcConfigurer 的addResourceHandlers將匹配上虛擬路徑的url映射到文件上傳到服務(wù)器的目錄,這樣就可以通過url來獲取服務(wù)器上的靜態(tài)資源了。

示例代碼

代碼倉庫github路徑

目標(biāo):windows本地測試,將文件上傳到 D:\develop\work\project\myblog\myblog-file-upload\fileStorage 目錄下,然后通過http://localhost:8080/files/文件名 訪問。

配置類

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    FileServiceImpl fileService;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //將匹配上/files/**虛擬路徑的url映射到文件上傳到服務(wù)器的目錄,獲取靜態(tài)資源
        registry.addResourceHandler("/" + fileService.pathPattern + "/**").addResourceLocations("file:" + fileService.filePath);
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

Controller

@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FileServiceImpl fileService;

    @PostMapping("/upload")
    public FileUploadResponse upload(@RequestParam("file") MultipartFile file) {
        return fileService.upload(file);
    }
}

上傳文件目錄創(chuàng)建好后,主要通過 file.transferTo(new File(absolutePath)) 完成。

Service

@Slf4j
@Service
public class FileServiceImpl {

    //攔截的url,虛擬路徑
    public String pathPattern = "files";

    //自己設(shè)置的目錄
    private static final String fileDir = "fileStorage";

    //上傳文件存放目錄  =  工作目錄絕對路徑 + 自己設(shè)置的目錄,也可以直接自己指定服務(wù)器目錄
    //windows本地測試
    //絕對路徑: D:\develop\work\project\myblog\myblog-file-upload\fileStorage\202302021010345680.jpg
    //System.getProperty("user.dir")   D:\develop\work\project\myblog\myblog-file-upload
    //fileDir                          fileStorage
    //fileName                         202302021010345680.jpg
    public String filePath = System.getProperty("user.dir") + File.separator + fileDir + File.separator;

    private static final AtomicInteger SUFFIX = new AtomicInteger(0);

    @Value(value = "${file.upload.suffix:jpg,jpeg,png,bmp,xls,xlsx,pdf}")
    private String fileUploadSuffix;

    public FileUploadResponse upload(MultipartFile file) {
        FileUploadResponse result = new FileUploadResponse();
        if (file.isEmpty()) {
            log.error("the file to be uploaded is empty");
            return result;
        }
        List<String> suffixList = Lists.newArrayList(fileUploadSuffix.split(","));

        try {
            //校驗文件后綴
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            if (!suffixList.contains(suffix)) {
                log.error("unsupported file format");
                return result;
            }

            //首次需生成目錄
            File folder = new File(filePath);
            if (!folder.exists()) {
                folder.mkdirs();
            }

            String fileName = timeFormat(System.currentTimeMillis()) + SUFFIX.getAndIncrement() + "." + suffix;
            String absolutePath = filePath + fileName;
            log.info("absolutePath is {}", absolutePath);
            file.transferTo(new File(absolutePath));

            String separator = "/";
            String path = separator + pathPattern + separator + fileName;
            result.setPath(path);
            result.setFileName(fileName);
        } catch (Exception e) {
            log.error("the file upload error occurred. e ", e);
        }
        return result;
    }

    public static String timeFormat(Long time) {
        if (Objects.isNull(time)) {
            return null;
        }
        DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sdf.format(time);
    }

}

四、測試

查看文件夾,已上傳成功

將上傳接口返回的path拼接上域名或者ip端口、訪問 http://localhost:8080/files/202302021010345680.jpg,得到:

五、總結(jié)

其實這和最初的SpringBoot獲取靜態(tài)資源的方式又有點不一樣,針對url做攔截,實際上resources目錄下并沒有files這個文件夾,它只是一個虛擬路徑,通過映射轉(zhuǎn)發(fā)到文件夾上傳目錄,在該目錄下通過文件名去定位。

另外,如果有用nginx,也可以在其配置中設(shè)置轉(zhuǎn)發(fā)。

到此這篇關(guān)于Java實現(xiàn)文件上傳到服務(wù)器本地并通過url訪問的文章就介紹到這了,更多相關(guān)Java文件上傳到服務(wù)器本地并訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?AOP簡介及統(tǒng)一處理

    Spring?AOP簡介及統(tǒng)一處理

    AOP面向切面編程,它是一種思想,它是對某一類事情的集中處理,本文給大家介紹Spring?AOP簡介及統(tǒng)一處理,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • java 并發(fā)編程之共享變量的實現(xiàn)方法

    java 并發(fā)編程之共享變量的實現(xiàn)方法

    這篇文章主要介紹了java 并發(fā)編程之共享變量的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例

    java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例

    本文主要介紹了java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • response.sendRedirect()實現(xiàn)重定向(頁面跳轉(zhuǎn))

    response.sendRedirect()實現(xiàn)重定向(頁面跳轉(zhuǎn))

    在Java web開發(fā)中,使用response.sendRedirect()可實現(xiàn)重定向功能。本文將介紹如何使用該方法進(jìn)行頁面跳轉(zhuǎn),以及該方法的使用場景和注意事項,感興趣的可以了解一下
    2023-04-04
  • 關(guān)于Java反射給泛型集合賦值問題

    關(guān)于Java反射給泛型集合賦值問題

    這篇文章主要介紹了Java反射給泛型集合賦值,需要的朋友可以參考下
    2022-01-01
  • Spring ApplicationListener監(jiān)聽器用法詳解

    Spring ApplicationListener監(jiān)聽器用法詳解

    這篇文章主要介紹了Spring ApplicationListener監(jiān)聽器用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java 數(shù)據(jù)結(jié)構(gòu)七大排序使用分析

    Java 數(shù)據(jù)結(jié)構(gòu)七大排序使用分析

    這篇文章主要介紹了Java常用的排序算法及代碼實現(xiàn),在Java開發(fā)中,對排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時候能夠有扎實的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來詳細(xì)說說Java常見的排序算法,需要的朋友可以參考一下
    2022-04-04
  • 關(guān)于Springboot的日志配置

    關(guān)于Springboot的日志配置

    Spring Boot默認(rèn)使用LogBack日志系統(tǒng),如果不需要更改為其他日志系統(tǒng)如Log4j2等,則無需多余的配置,LogBack默認(rèn)將日志打印到控制臺上,需要的朋友可以參考下
    2023-05-05
  • Java后端請求接收多個對象入?yún)⒌臄?shù)據(jù)方法(推薦)

    Java后端請求接收多個對象入?yún)⒌臄?shù)據(jù)方法(推薦)

    本文介紹了如何使用SpringBoot框架接收多個對象作為HTTP請求的入?yún)?通過創(chuàng)建數(shù)據(jù)模型、DTO類和Controller,我們可以輕松處理復(fù)雜的請求數(shù)據(jù)
    2024-11-11
  • Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    大家項目中如果有生成隨機(jī)數(shù)的需求,我想大多都會選擇使用Random來實現(xiàn),它內(nèi)部使用了CAS來實現(xiàn)。?實際上,JDK1.7之后,提供了另外一個生成隨機(jī)數(shù)的類ThreadLocalRandom,那么他們二者之間的性能是怎么樣的呢?本文就來詳細(xì)說說
    2022-12-12

最新評論

南漳县| 凤山市| 丰顺县| 海城市| 泌阳县| 四平市| 唐山市| 康定县| 天气| 重庆市| 肇州县| 安庆市| 晋城| 大方县| 衡山县| 鄂尔多斯市| 葫芦岛市| 稻城县| 自贡市| 马鞍山市| 盐津县| 阆中市| 庄浪县| 宜君县| 乐亭县| 德安县| 白山市| 左权县| 苗栗市| 南昌市| 毕节市| 和静县| 南宁市| 富平县| 高青县| 霸州市| 安徽省| 长白| 湘潭县| 涿鹿县| 奈曼旗|