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

SpringBoot讀寫xml上傳到AWS存儲(chǔ)服務(wù)S3的示例

 更新時(shí)間:2020年10月27日 09:15:07   作者:白42  
這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

最近的工作涉及到了生成xml文件并上傳到AWS存儲(chǔ)服務(wù)S3這樣的處理。期間遇到了兩個(gè)問(wèn)題,簡(jiǎn)單記錄下:

  • springboot讀取xml模板異常
  • 將生成的xml上傳到S3的問(wèn)題

springboot的版本是0,讀寫xml文件使用的是Dom4J,版本是1。逐個(gè)說(shuō)明下遇到的這幾個(gè)問(wèn)題。

1.springboot讀取xml模板異常

現(xiàn)階段是將xml模板文件存儲(chǔ)在springboot項(xiàng)目的resource目錄下的。具體路徑為

template/xxx.xml

最初是通過(guò)類加載器獲取文件路徑后再嘗試讀取模板文件的:

String fullPath = TemplateParser.class.getClassLoader().getResource(pathXml).getFile();
File file = new File(fullPath);
SAXReader reader = new SAXReader();
Document document = reader.read(file);

通過(guò)類加器獲取到的文件路徑是:

file:/path/of/jar/springboot-xml.jar!/BOOT-INF/classes!/template/xxx.xml

不過(guò)我們都知道,springboot是將整個(gè)工程包括配置文件打成一個(gè)jar包后再直接運(yùn)行。這樣想在linux的服務(wù)器上通過(guò)文件路徑找文件是注定找不到的。

后來(lái)改成直接通過(guò)SpringBoot提供的 ClassResource類來(lái)獲取resource路徑下的配置文件:

ClassPathResource resource = new ClassPathResource(pathXml);
Document doc = reader.read(resource.getInputStream());

這里直接使用 InputStream讀取的模板文件。注意不要再嘗試通過(guò)調(diào)用 ClassResource實(shí)例的 getFile()方法來(lái)獲取文件,不然會(huì)遇到和之前同樣的問(wèn)題。

額,期間還發(fā)生了無(wú)法將模板文件打進(jìn)springboot項(xiàng)目運(yùn)行時(shí)的jar文件這樣的問(wèn)題。因?yàn)槭菍⒛0逦募鎯?chǔ)在了resources的子目錄下,需要調(diào)整下maven打包的配置:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
</resources>

下面這幾行如果沒(méi)有的話需要加上,不然會(huì)讀取不到子目錄中的配置文件:

    <includes>
        <include>**/*</include>
    </includes>

2.將生成的xml上傳到S3

AWS提供的最便捷的上傳文件接口是這個(gè):

   public PutObjectResult putObject(String bucketName, String key, File file)
            throws SdkClientException, AmazonServiceException;

這個(gè)接口通過(guò) File實(shí)例來(lái)執(zhí)行上傳。所以我一開始的想法是先生成一個(gè)臨時(shí)文件保存在服務(wù)器本地,讀取本地臨時(shí)文件為 File執(zhí)行上傳,最后再刪掉本地的臨時(shí)文件。這個(gè)思路是沒(méi)問(wèn)題的,在本地執(zhí)行也OK。但是在生產(chǎn)環(huán)境,由于權(quán)限相關(guān)的問(wèn)題,生成臨時(shí)文件失敗了。

不想再去折騰權(quán)限相關(guān)的事情,所以將出路寄托在了AWS提供的另一個(gè)接口上:

  public PutObjectResult putObject(
            String bucketName, String key, InputStream input, ObjectMetadata metadata)
            throws SdkClientException, AmazonServiceException;

也就是說(shuō)考慮將xml文件內(nèi)容輸出到 InputStream,然后再將InputStream上傳到S3。一切都在內(nèi)存里執(zhí)行,不依賴外部文件系統(tǒng)也就不會(huì)有文件權(quán)限的問(wèn)題。

這個(gè)方案的問(wèn)題在于 ObjectMetaData這個(gè)類有點(diǎn)兒黑箱的意思。該怎么設(shè)置需要進(jìn)行一些摸索??戳艘槐檫@個(gè)類的接口文檔,需要調(diào)用的也就這兩個(gè)set方法:

/**
     *  Set the date when the object is no longer cacheable.
     */
    public void setHttpExpiresDate(Date httpExpiresDate) {
        this.httpExpiresDate = httpExpiresDate;
    }
    
    /**
     * <p>
     * Sets the Content-Length HTTP header indicating the size of the
     * associated object in bytes.
     * </p>
     * <p>
     * This field is required when uploading objects to S3, but the AWS S3 Java
     * client will automatically set it when working directly with files. When
     * uploading directly from a stream, set this field if
     * possible. Otherwise the client must buffer the entire stream in
     * order to calculate the content length before sending the data to
     * Amazon S3.
     * </p>
     */
    public void setContentLength(long contentLength) {
        metadata.put(Headers.CONTENT_LENGTH, contentLength);
    }

其中后者(文件長(zhǎng)度)是AWS建議設(shè)置的,不設(shè)置會(huì)在處理的時(shí)候給出WARN。根據(jù)方法文檔也可以看到,如果不設(shè)置,在上傳的時(shí)候就會(huì)在內(nèi)存中緩存整個(gè)信息流來(lái)計(jì)算文件長(zhǎng)度。

至于前者是上傳到S3文件的緩存過(guò)期時(shí)間,酌情設(shè)置即可。

另一個(gè)需要解決的問(wèn)題就是怎么將Dom4j生成的 Document輸出再讀取到 InputStream中。這里用到了 XmlWritter類,具體實(shí)現(xiàn)如下:

XMLWriter xmlWriter = new XMLWriter(outputStream, OutputFormat.createCompactFormat());
xmlWriter.write(doc);
xmlWriter.close();
return new ByteArrayInputStream(outputStream.toByteArray());

驗(yàn)證了一下,這個(gè)方法是可行的。修改后生產(chǎn)環(huán)境沒(méi)有再報(bào)錯(cuò)。

向AWS S3存儲(chǔ)服務(wù)上傳文件的實(shí)現(xiàn)代碼在這篇文章里:Java實(shí)現(xiàn)上傳文件到AWS S3

End!

以上就是SpringBoot讀寫xml上傳到S3的示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot讀寫xml的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java Spring Boot消息服務(wù)萬(wàn)字詳解分析

    Java Spring Boot消息服務(wù)萬(wàn)字詳解分析

    在實(shí)際項(xiàng)目開發(fā)中,有時(shí)需要與其他系統(tǒng)進(jìn)行集成完成相關(guān)業(yè)務(wù)功能,這種情況最原始做法是程序內(nèi)部相互調(diào)用,除此之外,還可以用消息服務(wù)中間件進(jìn)行業(yè)務(wù)處理,用消息服務(wù)中間件處理業(yè)務(wù)能夠提升系統(tǒng)的異步通信和擴(kuò)展解耦能力。Spring Boot對(duì)消息服務(wù)管理提供了非常好的支持
    2021-10-10
  • SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    所謂多級(jí)緩存,是指在整個(gè)系統(tǒng)架構(gòu)的不同系統(tǒng)層面進(jìn)行數(shù)據(jù)緩存,以提升訪問(wèn)速度,多級(jí)緩存就是為了解決項(xiàng)目服務(wù)中單一緩存使用不足的缺點(diǎn),本文我們將給大家總結(jié)了SpringBoot多級(jí)緩存實(shí)現(xiàn)方案,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)讀取html文本內(nèi)容并按照格式導(dǎo)出到excel中

    Java實(shí)現(xiàn)讀取html文本內(nèi)容并按照格式導(dǎo)出到excel中

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)讀取html文本提取相應(yīng)內(nèi)容按照格式導(dǎo)出到excel中,文中的示例代碼講解詳細(xì),需要的可以參考下
    2024-02-02
  • Netty學(xué)習(xí)教程之基礎(chǔ)使用篇

    Netty學(xué)習(xí)教程之基礎(chǔ)使用篇

    Netty是由JBOSS提供的一個(gè)Java開源框架。Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。下面這篇文章主要給大家介紹了關(guān)于Netty基礎(chǔ)使用的相關(guān)資料,需要的朋友可以參考下。
    2017-05-05
  • Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    這篇文章主要介紹了Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • IDEA 錯(cuò)誤之找不到或無(wú)法加載主類的問(wèn)題

    IDEA 錯(cuò)誤之找不到或無(wú)法加載主類的問(wèn)題

    這篇文章主要介紹了IDEA 錯(cuò)誤之找不到或無(wú)法加載主類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • IDEA2020.2.3

    IDEA2020.2.3 "reading maven projects"卡住的問(wèn)題

    這篇文章主要介紹了IDEA2020.2.3 "reading maven projects"卡住的問(wèn)題及問(wèn)題原因探究,通過(guò)多種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果

    Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果

    這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)多個(gè)窗口的切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot項(xiàng)目中使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用的示例代碼

    SpringBoot項(xiàng)目中使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用的示例代碼

    眾所周知在進(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,那么該通過(guò)什么技術(shù)去解決上述的問(wèn)題呢,本文小編給大家介紹了SpringBoot項(xiàng)目中使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用的方法,需要的朋友可以參考下
    2025-04-04
  • Java局部打印效果不同問(wèn)題解決方案

    Java局部打印效果不同問(wèn)題解決方案

    這篇文章主要介紹了Java局部打印效果不同問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

齐齐哈尔市| 腾冲县| 出国| 阜平县| 贵港市| 响水县| 卓尼县| 贵港市| 杂多县| 盐城市| 收藏| 镇沅| 和硕县| 临城县| 合阳县| 石家庄市| 镇坪县| 丰台区| 开江县| 永川市| 盱眙县| 莆田市| 宝兴县| 长沙市| 阳春市| 凉山| 砀山县| 桐梓县| 内乡县| 南平市| 上饶县| 全州县| 民权县| 庄浪县| 胶南市| 阿巴嘎旗| 儋州市| 秦安县| 郧西县| 北流市| 泸西县|