av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:5日期:2023-04-13 18:25:33

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

springboot讀取xml模板異常 將生成的xml上傳到S3的問題

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

1.springboot讀取xml模板異常

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

template/xxx.xml

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

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

通過類加器獲取到的文件路徑是:

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

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

后來改成直接通過SpringBoot提供的 ClassResource類來獲取resource路徑下的配置文件:

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

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

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

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

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

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

2.將生成的xml上傳到S3

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

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

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

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

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

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

這個(gè)方案的問題在于 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); }

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

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

另一個(gè)需要解決的問題就是怎么將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)境沒有再報(bào)錯。

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

End!

以上就是SpringBoot讀寫xml上傳到S3的示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot讀寫xml的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 97人人插 | 手机看片福利永久 | 免费国产黄色 | 亚洲无av在线中文字幕 | 国产女人高潮毛片 | 国产一区二区三区在线视频 | 日韩黄色一级视频 | 欧美在线综合 | 操操操日日日 | 久久视频免费观看 | 欧美特黄视频 | 日韩免费观看视频 | 成人黄性视频 | 久久理论片 | 91精品国产成人www | 免费一区二区三区 | 国产一区二区欧美 | 国产精品视频专区 | 亚洲一区二区三区视频 | 中文一区二区 | 三级在线播放 | 成人在线免费视频观看 | 久久香蕉国产 | 天天干夜夜拍 | 久久99精品久久久久久琪琪 | 天天操天天做 | 青青草91| 国产精品久久久久久99 | 亚洲精品少妇 | 五月开心激情网 | 青青视频网 | 亚洲免费在线 | 日本男人天堂 | 特级黄色大片 | 国产成人综合网 | 亚洲午夜一区 | 日韩中文字幕精品 | 可以看毛片的网站 | 男女久久久| 99精品视频在线 | 欧美人与野 |