近期在项目中发现,request.getInputStream()接收到的文件流中自带请求头信息,如果不对接收到的文件流进行处理,直接将文件流写入到硬盘上则会出现下面这种情况
文件流中会带有请求头信息,这些请求头信息对正常的下载预览打开是没有问题,在用户端也看不出来,但是涉及到第三方系统对接过程中,要实现在线预览,对方系统对这些字符就没法处理,这个时候问题就出来了。
第三方:你们接收文件的时候为啥要把头信息加进去?
我方:我们的文件没有问题,通过其他工具都可以打开,这个是你们要去处理的
皮球一直飞.....
要解决这个问题去掉文件流中请求头信息,可以通过下一下这段代码来解决
//附件上传
public String getSaveOfdFilePath(@QueryParam("fileId") String fileId, @QueryParam("summaryId") String summaryId) {
try {
Log.info("数科轻阅读服务器接收文件:fileId=" + fileId);
Log.info("数科轻阅读服务器接收公文Id:summaryId=" + summaryId);
String uploadPath = fileManager.getFolder(new Date(), true);
if (uploadPath.indexOf("upload") != -1) {
uploadPath = uploadPath.substring(0, uploadPath.indexOf("upload"));
uploadPath += "upload" + File.separator + "skReader" + File.separator + summaryId;
Log.info("M3数科轻阅读上传正文目录:--------------------" + uploadPath);
}
File file = new File(uploadPath);
if (!file.exists() || !file.isDirectory()) {
file.mkdirs();
}
String ofdUrl = uploadPath + File.separator + fileId + ".ofd";
Log.info("正文保存位置:-------------" + ofdUrl);
PrintWriter writer = response.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1 *1024 * 1024);
ServletFileUpload upload = new ServletFileUpload(factory);
String charset = request.getCharacterEncoding();
if (charset == null)
charset = "UTF-8";
upload.setHeaderEncoding(charset);
List<FileItem> items = upload.parseRequest(request);
if ((items == null) || items.isEmpty())
{
Log.info("附件为空!");
return "file is null";
}
FileItem fi = null;
for (FileItem item : items)
{
if (!item.isFormField())
{
fi = item;
break;
}
}
File toTargetFile = new File(ofdUrl);
if (fi != null)
{
if (fi instanceof DiskFileItem)
{
DiskFileItem dfi = (DiskFileItem)fi;
if (dfi.isInMemory())
{
byte[] b = dfi.get();
FileUtils.writeByteArrayToFile(toTargetFile, b);
}
else
{
File in = dfi.getStoreLocation();
FileUtils.copyFile(in, toTargetFile);
}
}
else
{
fi.write(toTargetFile);
}
toTargetFile.setLastModified(System.currentTimeMillis());
writer.write("success");
writer.flush();
}
/*InputStream inputStream = request.getInputStream();
if (inputStream != null) {
Log.info("数科轻阅读服务器接收文件:数据流 inputStream");
writeToLocal(ofdUrl, inputStream);
}*/
} catch (IOException e) {
Log.error("将正文上传到upload失败", e);
} catch (BusinessException e) {
Log.error("获取上传文件位置失败", e);
} catch (Exception e) {
Log.error("上传文件失败",e);
}
return "";
}
解决问题,如图:
没有请求头信息了