@@ -17,6 +17,8 @@ package baby.mumu.basis.kotlin.tools
17
17
18
18
import baby.mumu.basis.exception.MuMuException
19
19
import baby.mumu.basis.response.ResponseCode
20
+ import com.fasterxml.jackson.databind.ObjectMapper
21
+ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
20
22
import com.opencsv.CSVWriter
21
23
import com.opencsv.bean.StatefulBeanToCsvBuilder
22
24
import jakarta.servlet.http.HttpServletResponse
@@ -25,6 +27,8 @@ import org.apiguardian.api.API
25
27
import org.springframework.http.HttpHeaders
26
28
import org.springframework.http.MediaType
27
29
import org.springframework.util.Assert
30
+ import org.zalando.jackson.datatype.money.MoneyModule
31
+ import java.io.IOException
28
32
import java.io.InputStream
29
33
import java.io.OutputStreamWriter
30
34
import java.net.URLEncoder
@@ -160,6 +164,60 @@ object FileDownloadUtils {
160
164
}
161
165
}
162
166
167
+ @JvmStatic
168
+ @API(status = API .Status .STABLE , since = " 2.7.0" )
169
+ fun <T > downloadJson (
170
+ response : HttpServletResponse ,
171
+ fileName : String ,
172
+ stream : Stream <T >
173
+ ) {
174
+ var fileName = fileName
175
+ try {
176
+ Assert .isTrue(StringUtils .isNotBlank(fileName), " fileName must not be blank" )
177
+ if (! fileName.endsWith(" .json" )) {
178
+ fileName + = " .json"
179
+ }
180
+ // 创建 ObjectMapper 实例
181
+ val objectMapper = ObjectMapper ()
182
+ // 注册模块(例如时间模块和Money模块)
183
+ objectMapper.registerModule(JavaTimeModule ())
184
+ objectMapper.registerModule(MoneyModule ())
185
+
186
+ // 创建 ObjectWriter 实例
187
+ val objectWriter = objectMapper.writerWithDefaultPrettyPrinter()
188
+
189
+ // 获取 JSON 生成器
190
+ val generator = objectMapper.factory
191
+ .createGenerator(response.outputStream)
192
+ generator.useDefaultPrettyPrinter()
193
+
194
+ // 设置响应头
195
+ response.contentType = MediaType .APPLICATION_JSON_VALUE
196
+ response.setHeader(
197
+ HttpHeaders .CONTENT_DISPOSITION ,
198
+ " attachment; filename=" + encodeFileName(fileName)
199
+ )
200
+
201
+ // 写入 JSON 数组开始符
202
+ generator.writeStartArray()
203
+
204
+ // 遍历流并写入 JSON 对象
205
+ stream.forEach { obj: T ->
206
+ try {
207
+ objectWriter.writeValue(generator, obj)
208
+ } catch (_: IOException ) {
209
+ throw MuMuException (ResponseCode .FILE_DOWNLOAD_FAILED )
210
+ }
211
+ }
212
+ // 写入 JSON 数组结束符
213
+ generator.writeEndArray()
214
+ // 关闭生成器
215
+ generator.close()
216
+ } catch (_: java.lang.Exception ) {
217
+ throw MuMuException (ResponseCode .FILE_DOWNLOAD_FAILED )
218
+ }
219
+ }
220
+
163
221
/* *
164
222
* 处理文件名编码,避免中文或特殊字符导致文件名下载异常
165
223
*
0 commit comments