gpt4 book ai didi

Java:使用 REST 服务下载 CSV 文件

转载 作者:行者123 更新时间:2023-11-29 08:35:20 47 4
gpt4 key购买 nike

我正在尝试从 REST 端点下载 csv 文件。这就是我正在尝试的。

@ApiOperation(value = "export",
notes = "Export Cache details for a given criteria")
@ApiImplicitParams({

})
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Internal Server Error") })
@RequestMapping(method = RequestMethod.GET, value = "/export")
public ResponseEntity export( HttpServletRequest request )
{
CacheDataManager cacheResultHandler = new CacheDataManager();
InputStreamResource inputStreamResource = null;
HttpHeaders httpHeaders = new HttpHeaders();
long contentLengthOfStream;

try
{
inputStreamResource = cacheResultHandler.exportCacheResults( request );
httpHeaders.set( HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + "test.csv" );

contentLengthOfStream = inputStreamResource.contentLength();
httpHeaders.setContentLength( contentLengthOfStream );
}
catch ( IOException e )
{
e.printStackTrace();
}

return new ResponseEntity( inputStreamResource, httpHeaders, HttpStatus.OK );

}

我的导出函数。

@Override
public InputStreamResource export( HttpServletRequest request )
{
StringBuilder sb = new StringBuilder();
StringBuilder fileName = new StringBuilder( VALIDATION_REPORT );

sb.append( "Column A" );
sb.append( "," );
sb.append( "Column B" );
sb.append( "\n" );

try
{

sb.append( "TEST A");
sb.append( ',' );
sb.append( "TEST B" );
sb.append( '\n' );



fileName.append( "_" ).append( sdf.format( new Date() ) ).append( ".csv" );
return CsvFileWriter.csvFileWrite( fileName.toString(), sb );

}
catch ( Exception e )
{
e.printStackTrace();

}

return null;
}

CsvFileWriter.java

package it.app.ext.dashboard.util;

import org.springframework.core.io.InputStreamResource;

import java.io.*;

public class CsvFileWriter
{

public static InputStreamResource csvFileWrite( String fileName, StringBuilder content ) throws FileNotFoundException
{
File file = null;
PrintWriter pw = null;
try
{
file = new File( fileName );
pw = new PrintWriter( file );
pw.write( content.toString() );
}
catch ( FileNotFoundException e )
{
e.printStackTrace();
}
finally
{
pw.flush();
pw.close();
}

InputStream inputStream = new FileInputStream( file );

return new InputStreamResource( inputStream );
}

正在生成包含 tomcat/bin 文件夹中内容的文件,但出现异常。

java.lang.IllegalStateException: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times.

我想在调用此端点后下载一个 .csv 文件。

如有任何建议,我们将不胜感激。

谢谢你

最佳答案

解释:

你先得到了inputStream:

contentLengthOfStream =inputStreamResource.contentLength();

然后Spring的returnValueHandlers又得到了inputStream:

新的 ResponseEntity(inputStreamResource、httpHeaders、HttpStatus.OK)

但是inputStreamResource包裹的inputStream只能使用一次:

/**
* This implementation throws IllegalStateException if attempting to
* read the underlying stream multiple times.
*/
public InputStream getInputStream() throws IOException, IllegalStateException {
if (this.read) {
throw new IllegalStateException("InputStream has already been read - " +
"do not use InputStreamResource if a stream needs to be read multiple times");
}
this.read = true;
return this.inputStream;
}

解决方案:您可以从 inputStream 中获取字节并返回带字节的 ResponseEntity。

@ApiOperation(value = "export",
notes = "Export Cache details for a given criteria")
@ApiImplicitParams({

})
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Internal Server Error") })
@RequestMapping(method = RequestMethod.GET, value = "/export")
public ResponseEntity export( HttpServletRequest request )
{
CacheDataManager cacheResultHandler = new CacheDataManager();
InputStreamResource inputStreamResource = null;
InputStream inputStream = null;
byte[] byteArray = new byte[0];
HttpHeaders httpHeaders = new HttpHeaders();

try
{
inputStreamResource = cacheResultHandler.exportCacheResults( request );
httpHeaders.set( HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + "test.csv" );

//convert inputStream to bytes
inputStream = inputStreamResource.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}

buffer.flush();
byteArray = buffer.toByteArray();

httpHeaders.setContentLength(byteArray.length);
}
catch ( IOException e )
{
e.printStackTrace();
}

return new ResponseEntity( byteArray, httpHeaders, HttpStatus.OK );

}

建议使用Apache Commons IO将InputStream转换为字节。需要添加一个lib依赖,这可以使您的代码简洁

byte[] byteArray = IOUtils.toByteArray(inputStream);

关于Java:使用 REST 服务下载 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44536141/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com