ここでは最初の3つの明確な概念とそれらの関係、
ブラウザブラウザ
オフィス・サーバ・オフィスソフトウェア
ファイルサーバ、文書管理サーバ
次の図は、ケースを示したときに、プレビュー要求処理
簡単な説明は次のとおりです。
ここではいくつかの問題への注意:
図1は、簡単にアドレス形式の変更を要求しません
2、ファイル名とリターンベースファイル名一貫性の回避の問題多くの素晴らしい作品に要求アドレス。
要求されたデータが戻り流の形態である場合3はgetFileは、指定されたコンテンツタイプ場合、返さ
アプリケーション/ octet-streamと。RestControllerを使用しないように最善のことをあります
計算のアリOSS方法は次のようなリモートファイルサイズからファイルを取得するために4:
/**
* 从输入流中获取字节数组
* @param inputStream
* @return
* @throws IOException
*/
private static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
次のように統合コードは次のとおりです。
フィルタの実装、統合パーミッションチェック
/**
* 处理office的文档预览,Token处理
* @author 大仙
*/
@Slf4j
@WebFilter(filterName = "officeFilter", urlPatterns = "/wopi/*")
public class OfficeFilter implements Filter {
@Autowired
private TokenCheckService authService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("init....");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String token = request.getParameter("access_token");
if(StringUtils.isBlank(token)){
fail(403,"无权限",response);
return;
}
BaseUser baseUser = AccessTokenUtil.getBaseUserByToken(token);
if(baseUser==null){
fail(403,"无权限",response);
return;
}
if(!authService.checkTokenValid(baseUser,token)){
fail(403,"无权限",response);
return;
}
log.info("执行");
servletRequest.setAttribute("userName",baseUser.getName());
chain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
log.info("destroy....");
}
/**
* 失败处理
* @param code
* @param message
* @param response
* @throws Exception
*/
private void fail(Integer code,String message,HttpServletResponse response) throws IOException{
response.setStatus(403);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(JSONObject.toJSONString(CommonResponse.successResponse("无权限")));
}
}
ステップ2:checkFileInfo実装
@Override
public String getFileInfo(String fileId, HttpServletRequest request) {
logger.info("开始获取文件数据");
if(StringUtils.isBlank(fileId)){
throw new OrganException("文件ID不能为空");
}
fileId = fileId.substring(0,fileId.lastIndexOf("."));
Long id = Long.parseLong(fileId);
LessonContent lessonContent = lessonContentDao.getById(id);
if(lessonContent==null){
throw new OrganException("id不存在,非法请求");
}
String pptUrl = lessonContent.getPptUrl();
String handUrl = lessonContent.getHandbookUrl();
if(StringUtils.isBlank(pptUrl)&&StringUtils.isBlank(handUrl)){
throw new OrganException("无需要预览的内容");
}
//获取最终预览的文件
String fileUrl = pptUrl==null?handUrl:pptUrl;
JSONObject result = new JSONObject();
String BaseFileName=id+""+fileUrl.substring(fileUrl.lastIndexOf("."));
String ownerId = "admin";
String version = lessonContent.getCreateDate().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
Integer size = 0;
try {
URL url = new URL(fileUrl);
InputStream is = url.openStream();
byte[] bytes = readInputStream(is);
size = bytes.length;
}catch (Exception e){
logger.error("读取文件出错");
}
return "{\"BaseFileName\":\"" + BaseFileName + "\",\"OwnerId\":\"" + ownerId + "\",\"Size\":\"" + size
+ "\",\"AllowExternalMarketplace\":\"" + true + "\",\"Version\":\"" + version + "\"}";
}
第三段階:はgetFileを達成
@Override
public HttpServletResponse getFile(HttpServletResponse response, String fileId) {
logger.info("开始获取文件数据--数据流");
if(StringUtils.isBlank(fileId)){
throw new OrganException("文件ID不能为空");
}
fileId = fileId.substring(0,fileId.lastIndexOf("."));
Long id = Long.parseLong(fileId);
LessonContent lessonContent = lessonContentDao.getById(id);
if(lessonContent==null){
throw new OrganException("id不存在,非法请求");
}
String pptUrl = lessonContent.getPptUrl();
String handUrl = lessonContent.getHandbookUrl();
if(StringUtils.isBlank(pptUrl)&&StringUtils.isBlank(handUrl)){
throw new OrganException("无需要预览的内容");
}
//获取最终预览的文件
String fileUrl = pptUrl==null?handUrl:pptUrl;
String BaseFileName=id+""+fileUrl.substring(fileUrl.lastIndexOf("."));
try {
URL url = new URL(fileUrl);
InputStream fis = url.openStream();
String contentType = "application/octet-stream";
byte[] buffer = readInputStream(fis);
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition","attachment;filename=" + new String(BaseFileName.getBytes("utf-8"), "ISO-8859-1"));
response.addHeader("Content-Length", "" + buffer.length);
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType(contentType);
toClient.write(buffer);
toClient.flush();
toClient.close();
}catch (Exception e){
logger.error("读取文件出错");
}
return response;
}