最近针对于项目需求,有时会需要实现某些文件的的在线预览,方便用户进行阅读,基于这个目的,
以下就是实现PDF文件的在线预览。
1.先定义一个entity,如下:
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("t_cmp_work_enclosure")
public class Enclosure implements Serializable {
private static final long serialVersionUID = 1L;
@TableField("name")
private String name;//附件名称
@TableField("id")
@TableId(value="id",type = IdType.AUTO)
private Integer id;//附件id
@TableField("uploadID")
private Integer uploadID;//上传人id
@TableField("uploadName")
private String uploadName;//上传人名称
@TableField("uploadTm")
private String uploadTm;//上传时间
@TableField("desc")
private String desc;//附件描述
@TableField("url")
private String url;//存储路径
@TableField("sourceID")
private String sourceID;
}
2.再定义一个mapper层,以下用的是mybatisplus,如下:
import cn.com.suntree.cmp.entity.Enclosure;
import cn.com.suntree.cmp.entity.Pager;
import cn.com.suntree.cmp.mapper.provide.EnclosureProvide;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EnclosureMapper extends BaseMapper<Enclosure> {
String tableName = "t_cmp_work_enclosure";
/**
* 根据id获取附件
* @param id
* @return
*/
@Select("select * from "+tableName+" where id=#{id}")
Enclosure getEnclosureById(Integer id);
}
3,接下来就可以在service层写对应的方法了,代码如下:
/**
* pdf在线预览
* @param request
* @param response
* @param destUrl
* @throws ServletException
* @throws IOException
*/
public void onPreview(Integer id,HttpServletRequest request, HttpServletResponse response) {
doGet(id,request,response);
}
public void doGet(Integer id,HttpServletRequest request, HttpServletResponse response) {
BufferedInputStream bis =null;
OutputStream sos=null;
try {
response.reset(); // 非常重要
response.setContentType("application/pdf");
response.setHeader("Access-Control-Allow-Origin", "*"); // 解决请求头跨域问题
sos = response.getOutputStream();
Enclosure enclosure=enclosureMapepr.getEnclosureById(id);
if(enclosure==null) {
log.error("未找到附件");
}
String destUrl=enclosure.getUrl();
URL url = new URL(destUrl);
HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
httpUrl.setRequestMethod("GET");
httpUrl.setConnectTimeout(5 * 1000);
// 连接指定的网络资源
httpUrl.connect();
// 获取网络输入流
bis = new BufferedInputStream(httpUrl.getInputStream());
byte[] buf = new byte[1024];
int len = 0;
while ((len = bis.read(buf))!= -1){
sos.write(buf,0,len);
}
}catch(Exception e) {
log.error(e.getMessage());
}finally {
if(sos!=null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bis!=null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.最后在controller层里调用service层里的方法即可实现pdf在线预览。