webservice传递文件
前言
提示:有些特定环境需要把文件传递到其他系统,但通过webservice传递的情况会有很多种情况,如小文件(图片等小于3M的文件),大文件(大于10M的文件);
因此采用几种方式:
1、小于3M(不大于7M)的情况,使用转化为文件流进行传递
2、大于10M的情况下使用DataHandler传递及URL下载的方式。
一、转化为文件流作为参数直接传递
1. 传递参数(文件)
1、引用
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
2、方法
//得到接口传递参数json串
public boolean getFileInfo(String dataId) {
boolean flag = false;
if(!"".equals(dataId)){
String sql="select * from w_table where id='"+dataId+"'";
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
//其他信息在list里
for (Map<String, Object> map : list) {
try {
//附件传递
String fileField = CommonTools.Obj2String(map.get("F_FJ"));
if (!"".equals(fileField)) {
JSONArray files = JSONArray.parseArray(fileField);
for (int i = 0; i< files.size(); i++) {
JSONObject file = (JSONObject) files.get(i);
String fileId = file.get("id").toString();
SysFile wtfj = sysFileService.getById(Long.valueOf(fileId));
map.put("F_wtfj_Content_" + i, this.getFileStream(wtfj));
map.put("F_wtfj_Security_" + i, wtfj.getSecurity());
map.put("F_wtfj_Describe_" + i, wtfj.getDescribe());
map.put("F_wtfj_Dimension_" + i, wtfj.getDimension());
map.put("F_wtfj_Creator_" + i, wtfj.getCreator());
map.put("F_wtfj_CreatorId_" + i, wtfj.getCreatorId().toString());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
if(list.size()>0){
flag = getConnection(JSON.toJSONString(list));
}
}
return flag;
}
//转换文件字符串
public String getFileStream(SysFile sysFile) throws FileNotFoundException {
String filename = sysFile.getFilename() + "." + sysFile.getExt();
String filepath = AppUtil.getAttachPath() + File.separator + String.valueOf(sysFile.getFilepath());
Boolean isNoGroup = sysFile.getFilepath().startsWith("group");//判断是否分布式文件
String destFilePath="";
if(isNoGroup){//分布式文件存储解密操作
filepath = sysFile.getFilepath();
// by liubo:对加密文件进行解密处理
destFilePath = this.sysFileService.getDecodeFilePath(filepath, filename, sysFile.getIsEncrypt(),false);
if (!"".equals(destFilePath)) {
filepath = destFilePath;
//分布式文件进行解密处理后就按照本地文件进行压缩等操作
isNoGroup = false;
}
} else {
// by weilei:对加密文件进行解密处理
destFilePath = this.sysFileService.getDecodeFilePath(filepath, filename, sysFile.getIsEncrypt(),false);
if (!"".equals(destFilePath)) {
filepath = destFilePath;
}
}
//根据文件路径得到文件流
File file = new File(filepath);
FileInputStream is = new FileInputStream(file);
String fileStr = null;
try {
fileStr = streamToString(is);
} catch (IOException e) {
e.printStackTrace();
}
return fileStr;
}
/**
* 将流转换成字符串 使用Base64加密
*
* @param in输入流
* @return
* @throws IOException
*/
public static String streamToString(InputStream inputStream) throws IOException {
byte[] bt = toByteArray(inputStream);
inputStream.close();
String out = new sun.misc.BASE64Encoder().encodeBuffer(bt);
return out;
}
/**
*
* summary:将流转化为字节数组
*
* @param inputStream
* @return
* @throws IOException
*
*/
public static byte[] toByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
byte[] result = null;
try {
int n = 0;
while ((n = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
result = out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
out.close();
}
return result;
}
//添加接口校验的用户信息
public Call getUser() {
Call call = null;
try {
Service service = new Service();
call = (Call)service.createCall();
String url="http://127.0.0.1:8085/ibms/services/IQualityProblemsSyncService";
call.setTargetEndpointAddress(new java.net.URL(url));
//调用方法名
call.setOperationName("getQualityProblems");
//调用时间20s
call.setTimeout(20000);
} catch (Exception e) {
e.printStackTrace();
}
return call;
}
//调用接口
public boolean getConnection(String Info){
boolean flag=false;
try{
Call call =serviceUtil.getUser();
String result = (String) call.invoke(new Object[]{Info});
flag =true;
}
catch(Exception e){
flag=false;
e.printStackTrace();
}
return flag;
}
2. 接收参数(文件)
1、引用
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import sun.misc.BASE64Decoder;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cssrc.ibms.api.core.util.UniqueIdUtil;
import com.cssrc.ibms.api.log.util.LogThreadLocalHolder;
import com.cssrc.ibms.api.system.util.PropertyUtil;
import com.cssrc.ibms.api.sysuser.intf.ISysOrgService;
import com.cssrc.ibms.api.sysuser.intf.ISysUserService;
import com.cssrc.ibms.api.sysuser.model.ISysOrg;
import com.cssrc.ibms.api.sysuser.model.ISysUser;
import com.cssrc.ibms.api.sysuser.util.UserContextUtil;
import com.cssrc.ibms.core.db.mybatis.dao.JdbcDao;
import com.cssrc.ibms.core.form.service.SerialNumberService;
import com.cssrc.ibms.core.util.appconf.AppUtil;
import com.cssrc.ibms.core.util.bean.BeanUtils;
import com.cssrc.ibms.core.util.common.CommonTools;
import com.cssrc.ibms.core.util.date.DateUtil;
import com.cssrc.ibms.core.util.file.FileOperator;
import com.cssrc.ibms.core.util.string.StringUtil;
import com.cssrc.ibms.system.model.SysFile;
import com.cssrc.ibms.system.model.SysFileFolder;
import com.cssrc.ibms.system.model.SysParameter;
import com.cssrc.ibms.system.service.SolrService;
import com.cssrc.ibms.system.service.SysFileFolderService;
import com.cssrc.ibms.system.service.SysFileService;
import com.cssrc.ibms.system.service.SysParameterService;
import com.cssrc.ibms.system.service.SysTypeKeyService;
import com.cssrc.ibms.system.util.SysFileUtil;
import com.cssrc.ibms.webservice.IQualityProblemsSyncService;
2、代码
//接收数据
public String getQualityProblems(String listString) {
String msg = "";
if (!"".equals(listString)) {
List<Map<String, Object>> list = toListMap(listString);
for (Map<String, Object> map : list) {
String id = CommonTools.Obj2String(map.get("ID"));
String F_FJ = CommonTools.Obj2String(map.get("F_FJ"));
if (StringUtil.isNotEmpty(F_FJ)) {
JSONArray newFiles = new JSONArray();
JSONArray files = JSONArray.parseArray(F_FJ);
for (int i=0; i<files.size(); i++) {
JSONObject file = (JSONObject) files.get(i);
String wtfj_FileName = file.get("name").toString();
String wtfj_Content = CommonTools.Obj2String(map.get("F_wtfj_Content_"+i));
String wtfj_Creator = CommonTools.Obj2String(map.get("F_wtfj_Creator_"+i));
String wtfj_CreatorId = CommonTools.Obj2String(map.get("F_wtfj_CreatorId_"+i));
String wtfjId = this.handleFile(wtfj_Content, wtfj_FileName, wtfj_Security, wtfj_Describe,
wtfj_Dimension, wtfj_Creator, wtfj_CreatorId);
file.put("id", wtfjId);
newFiles.add(file);
}
map.put("F_wtfj", newFiles.toString());
}
// 其他字段
String XX = CommonTools.Obj2String(map.get("XX"));//密级
//文件附件重新获取
String wtfj = CommonTools.Obj2String(map.get("F_wtfj"));
//更新or插入
String sql = "select * from w_table where id = '" + id + "'";
List<Map<String, Object>> datas = jdbcDao.queryForList(sql, null);
if (datas.size()>0) {
String upsql="update w_zlwtb set F_MJ='"+F_MJ+"',F_XXMC='"+F_XXMC+"' WHERE id='"+id+"'";
jdbcDao.upd(upsql);
} else {
String id1=String.valueOf(UniqueIdUtil.genId());
String zlSql = "insert into w_zlwtb "
+ "(XX,XX) values "
+ "("+id1+",'"+XX+"')";
jdbcDao.upd(zlSql);
}
}
}
return msg;
}
@SuppressWarnings("unchecked")
public static List<Map<String, Object>> toListMap(String json) {
List<Object> list = JSON.parseArray(json);
List<Map<String, Object>> listw = new ArrayList<Map<String, Object>>();
for (Object object : list) {
Map<String, Object> ret = (Map<String, Object>) object;// 取出list里面的值转为map
listw.add(ret);
}
return listw;
}
//文件上传系统并记录数据 fileContent文件流字符串
@SuppressWarnings("unchecked")
public String handleFile(String fileContent, String fileName, String security, String describe, String dimension, String creator, String creatorId) {
Long fileId = UniqueIdUtil.genId();
try {
InputStream is = new ByteArrayInputStream(fileContent.getBytes());
BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] content = decoder.decodeBuffer(is);
String extName = FileOperator.getSuffix(fileName);
String relativeFullPath = FileOperator.generateFilenameNoSemicolon(fileName);
// 附件保存路径
String attachPath = AppUtil.getAttachPath();
Calendar cal = Calendar.getInstance();
String storePath= ""+cal.get(Calendar.YEAR)+File.separator+(cal.get(Calendar.MONTH)+1)+File.separator+cal.get(Calendar.DAY_OF_MONTH);
String filePath = "";
SysFile sysFile = new SysFile();
sysFile.setFileId(fileId);
//By weilei:添加文件上传参数:密级、描述
if(CommonTools.isNullString(security)) {
security = "";
}else{
LogThreadLocalHolder.putParamerter("resourceSecretLevel",ISysUser.SECURITY_USER_MAP.get(security));
}
sysFile.setSecurity(security);
sysFile.setDescribe(describe);
sysFile.setKeywordText("");
sysFile.setDimension(dimension);
//获取系统是否加密的参数
List<SysParameter> needEncrypt = sysParameterService.getByParamName("IS_SAVE_SECURITY");
if (needEncrypt.size() > 0 && "是".equals(needEncrypt.get(0).getParamvalue())) {
//给文件是否加密属性设置为加密
sysFile.setIsEncrypt(1L);
}
// 附件保存路径
String saveType = PropertyUtil.getSaveType();
if (saveType.contains("database"))
sysFile.setFileBlob(content);
else {
filePath = SysFileUtil.createFilePath(attachPath+ File.separator+storePath + File.separator, relativeFullPath);
FileOperator.writeByte(filePath, content);
}
// end 写入物理文件
// 向数据库中添加数据 FileUtils
// 附件名称
sysFile.setFilename(fileName.substring(0, fileName.lastIndexOf('.')));
relativeFullPath = storePath + File.separator + relativeFullPath;
sysFile.setFilepath(relativeFullPath); //保存相对路径
// 上传时间
sysFile.setCreatetime(new java.util.Date());
// 扩展名
sysFile.setExt(extName);
// 字节总数
int len = content.length;
sysFile.setTotalBytes((long) len);
// 说明
sysFile.setNote("");
sysFile.setCreatorId(Long.valueOf(creatorId));
sysFile.setCreator(creator);
// 总的字节数
sysFile.setDelFlag(SysFile.FILE_NOT_DEL);
sysFile.setParentId(sysFile.getFileId());//初始版本两值一致
//类型
sysFile.setProtypeId(8L);
sysFile.setFileType("FILE");
sysFile.setFolderid(-1L);
sysFile.setFileatt(SysFile.FILEATT_TRUE);
sysFile.setShared((short) 0);
this.sysFileService.add(sysFile);
List<SysFile> sysFiles;
if (LogThreadLocalHolder.getParamerter("sysFiles") == null) {
sysFiles = new ArrayList<SysFile>();
LogThreadLocalHolder.putParamerter("sysFiles", sysFiles);
} else {
sysFiles = (List<SysFile>) LogThreadLocalHolder.getParamerter("sysFiles");
}
sysFiles.add(sysFile);
} catch (Exception e) {
e.printStackTrace();
}
return fileId.toString();
}
二、DataHandler方式
1. 传递参数
1、引用
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
2、方法
//这样就相当于构造了一个带文件路径的File了
DataHandler handler = new DataHandler(new FileDataSource(path));
//然后把DataHandler参数进行传递,注意需要发布方的参数是DataHandler
2. 接收参数
InputStream inputStream = handler.getInputStream();
三、URL下载
1. 传递参数
//把下载文件的url放到参数里
//如:http://127.0.0.1:8080/ibms/S2001/qmsProject/downloadFile.do?fileId=fileId
//得到接口传递参数json串
public boolean getFileInfo(String dataId) {
boolean flag = false;
if(!"".equals(dataId)){
String sql="select * from w_table where id='"+dataId+"'";
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
//获取下载文件url
List<? extends ISysParameter> downloadUrlList = sysParameterService.getByParamName("downloadUrl");
String downloadUrl = downloadUrlList.get(0).getParamvalue();
//其他信息在list里
for (Map<String, Object> map : list) {
try {
//附件传递
String fileField = CommonTools.Obj2String(map.get("F_FJ"));
if (!"".equals(fileField)) {
JSONArray files = JSONArray.parseArray(fileField);
for (int i = 0; i< files.size(); i++) {
JSONObject file = (JSONObject) files.get(i);
String fileId = file.get("id").toString();
//存入文件
SysFile wtfj = sysFileService.getById(Long.valueOf(fileId));
String downString = downloadUrl+fileId;
//原内容用文件ID代替
map.put("F_wtfj_Content_" + i, downString);
map.put("F_wtfj_Security_" + i, wtfj.getSecurity());
map.put("F_wtfj_Describe_" + i, wtfj.getDescribe());
map.put("F_wtfj_Dimension_" + i, wtfj.getDimension());
map.put("F_wtfj_Creator_" + i, wtfj.getCreator());
map.put("F_wtfj_CreatorId_" + i, wtfj.getCreatorId().toString());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
if(list.size()>0){
flag = getConnection(JSON.toJSONString(list));
}
}
return flag;
}
//转换文件字符串
public String getFileStream(SysFile sysFile) throws FileNotFoundException {
String filename = sysFile.getFilename() + "." + sysFile.getExt();
String filepath = AppUtil.getAttachPath() + File.separator + String.valueOf(sysFile.getFilepath());
Boolean isNoGroup = sysFile.getFilepath().startsWith("group");//判断是否分布式文件
String destFilePath="";
if(isNoGroup){//分布式文件存储解密操作
filepath = sysFile.getFilepath();
// by liubo:对加密文件进行解密处理
destFilePath = this.sysFileService.getDecodeFilePath(filepath, filename, sysFile.getIsEncrypt(),false);
if (!"".equals(destFilePath)) {
filepath = destFilePath;
//分布式文件进行解密处理后就按照本地文件进行压缩等操作
isNoGroup = false;
}
} else {
// by weilei:对加密文件进行解密处理
destFilePath = this.sysFileService.getDecodeFilePath(filepath, filename, sysFile.getIsEncrypt(),false);
if (!"".equals(destFilePath)) {
filepath = destFilePath;
}
}
//根据文件路径得到文件流
File file = new File(filepath);
FileInputStream is = new FileInputStream(file);
String fileStr = null;
try {
fileStr = streamToString(is);
} catch (IOException e) {
e.printStackTrace();
}
return fileStr;
}
/**
* 将流转换成字符串 使用Base64加密
*
* @param in输入流
* @return
* @throws IOException
*/
public static String streamToString(InputStream inputStream) throws IOException {
byte[] bt = toByteArray(inputStream);
inputStream.close();
String out = new sun.misc.BASE64Encoder().encodeBuffer(bt);
return out;
}
/**
*
* summary:将流转化为字节数组
*
* @param inputStream
* @return
* @throws IOException
*
*/
public static byte[] toByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
byte[] result = null;
try {
int n = 0;
while ((n = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
result = out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
out.close();
}
return result;
}
//添加接口校验的用户信息
public Call getUser() {
Call call = null;
try {
Service service = new Service();
call = (Call)service.createCall();
String url="http://127.0.0.1:8085/ibms/services/IQualityProblemsSyncService";
call.setTargetEndpointAddress(new java.net.URL(url));
//调用方法名
call.setOperationName("getQualityProblems");
//调用时间20s
call.setTimeout(20000);
} catch (Exception e) {
e.printStackTrace();
}
return call;
}
//调用接口
public boolean getConnection(String Info){
boolean flag=false;
try{
Call call =serviceUtil.getUser();
String result = (String) call.invoke(new Object[]{Info});
flag =true;
}
catch(Exception e){
flag=false;
e.printStackTrace();
}
return flag;
}
2. 接收参数
1、引用
package com.cssrc.ibms.webservice.Impl;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.activation.DataHandler;
import javax.annotation.Resource;
import sun.misc.BASE64Decoder;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cssrc.ibms.api.core.util.UniqueIdUtil;
import com.cssrc.ibms.api.log.util.LogThreadLocalHolder;
import com.cssrc.ibms.api.system.util.PropertyUtil;
import com.cssrc.ibms.api.sysuser.intf.ISysOrgService;
import com.cssrc.ibms.api.sysuser.intf.ISysUserService;
import com.cssrc.ibms.api.sysuser.model.ISysOrg;
import com.cssrc.ibms.api.sysuser.model.ISysUser;
import com.cssrc.ibms.api.sysuser.util.UserContextUtil;
import com.cssrc.ibms.core.db.mybatis.dao.JdbcDao;
import com.cssrc.ibms.core.form.service.SerialNumberService;
import com.cssrc.ibms.core.util.appconf.AppUtil;
import com.cssrc.ibms.core.util.bean.BeanUtils;
import com.cssrc.ibms.core.util.common.CommonTools;
import com.cssrc.ibms.core.util.date.DateUtil;
import com.cssrc.ibms.core.util.file.FileOperator;
import com.cssrc.ibms.core.util.string.StringUtil;
import com.cssrc.ibms.system.model.GlobalType;
import com.cssrc.ibms.system.model.SysFile;
import com.cssrc.ibms.system.model.SysFileFolder;
import com.cssrc.ibms.system.model.SysFileType;
import com.cssrc.ibms.system.model.SysParameter;
import com.cssrc.ibms.system.service.GlobalTypeService;
import com.cssrc.ibms.system.service.SolrService;
import com.cssrc.ibms.system.service.SysFileFolderService;
import com.cssrc.ibms.system.service.SysFileService;
import com.cssrc.ibms.system.service.SysFileTypeService;
import com.cssrc.ibms.system.service.SysParameterService;
import com.cssrc.ibms.system.service.SysTypeKeyService;
import com.cssrc.ibms.system.util.SysFileUtil;
import com.cssrc.ibms.webservice.IQualityProblemsSyncService;
2、代码
public String getQualityProblems(String listString) {
String msg = "";
if (!"".equals(listString)) {
List<Map<String, Object>> list = toListMap(listString);
for (Map<String, Object> map : list) {
String id = CommonTools.Obj2String(map.get("ID"));
String F_FJ = CommonTools.Obj2String(map.get("F_FJ"));
if (StringUtil.isNotEmpty(F_FJ)) {
JSONArray newFiles = new JSONArray();
JSONArray files = JSONArray.parseArray(F_FJ);
for (int i=0; i<files.size(); i++) {
JSONObject file = (JSONObject) files.get(i);
String wtfj_FileName = file.get("name").toString();
String wtfj_Url = CommonTools.Obj2String(map.get("F_wtfj_Content_"+i));
String wtfj_Security = CommonTools.Obj2String(map.get("F_wtfj_Security_"+i));
String wtfj_Describe = CommonTools.Obj2String(map.get("F_wtfj_Describe_"+i));
String wtfj_Dimension = CommonTools.Obj2String(map.get("F_wtfj_Dimension_"+i));
String wtfj_Creator = CommonTools.Obj2String(map.get("F_wtfj_Creator_"+i));
String wtfj_CreatorId = CommonTools.Obj2String(map.get("F_wtfj_CreatorId_"+i));
String wtfjId = this.handleFileUrl(wtfj_Url, wtfj_FileName, wtfj_Security, wtfj_Describe,
wtfj_Dimension, wtfj_Creator, wtfj_CreatorId);
file.put("id", wtfjId);
newFiles.add(file);
}
map.put("F_wtfj", newFiles.toString());
}
// 其他字段
String XX = CommonTools.Obj2String(map.get("XX"));//密级
//文件附件重新获取
String wtfj = CommonTools.Obj2String(map.get("F_wtfj"));
//更新or插入
String sql = "select * from w_table where id = '" + id + "'";
List<Map<String, Object>> datas = jdbcDao.queryForList(sql, null);
if (datas.size()>0) {
String upsql="update w_zlwtb set F_MJ='"+F_MJ+"',F_XXMC='"+F_XXMC+"' WHERE id='"+id+"'";
jdbcDao.upd(upsql);
} else {
String id1=String.valueOf(UniqueIdUtil.genId());
String zlSql = "insert into w_zlwtb "
+ "(XX,XX) values "
+ "("+id1+",'"+XX+"')";
jdbcDao.upd(zlSql);
}
}
}
return msg;
}
@SuppressWarnings("unchecked")
public static List<Map<String, Object>> toListMap(String json) {
List<Object> list = JSON.parseArray(json);
List<Map<String, Object>> listw = new ArrayList<Map<String, Object>>();
for (Object object : list) {
Map<String, Object> ret = (Map<String, Object>) object;// 取出list里面的值转为map
listw.add(ret);
}
return listw;
}
//文件上传系统并记录数据 fileContent文件流字符串
@SuppressWarnings("unchecked")
public String handleFile(String fileContent, String fileName, String security, String describe, String dimension, String creator, String creatorId) {
Long fileId = UniqueIdUtil.genId();
try {
InputStream is = new ByteArrayInputStream(fileContent.getBytes());
BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] content = decoder.decodeBuffer(is);
String extName = FileOperator.getSuffix(fileName);
String relativeFullPath = FileOperator.generateFilenameNoSemicolon(fileName);
// 附件保存路径
String attachPath = AppUtil.getAttachPath();
Calendar cal = Calendar.getInstance();
String storePath= ""+cal.get(Calendar.YEAR)+File.separator+(cal.get(Calendar.MONTH)+1)+File.separator+cal.get(Calendar.DAY_OF_MONTH);
String filePath = "";
SysFile sysFile = new SysFile();
sysFile.setFileId(fileId);
//By weilei:添加文件上传参数:密级、描述
if(CommonTools.isNullString(security)) {
security = "";
}else{
LogThreadLocalHolder.putParamerter("resourceSecretLevel",ISysUser.SECURITY_USER_MAP.get(security));
}
sysFile.setSecurity(security);
sysFile.setDescribe(describe);
sysFile.setKeywordText("");
sysFile.setDimension(dimension);
//获取系统是否加密的参数
List<SysParameter> needEncrypt = sysParameterService.getByParamName("IS_SAVE_SECURITY");
if (needEncrypt.size() > 0 && "是".equals(needEncrypt.get(0).getParamvalue())) {
//给文件是否加密属性设置为加密
sysFile.setIsEncrypt(1L);
}
// 附件保存路径
String saveType = PropertyUtil.getSaveType();
if (saveType.contains("database"))
sysFile.setFileBlob(content);
else {
filePath = SysFileUtil.createFilePath(attachPath+ File.separator+storePath + File.separator, relativeFullPath);
FileOperator.writeByte(filePath, content);
}
// end 写入物理文件
// 向数据库中添加数据 FileUtils
// 附件名称
sysFile.setFilename(fileName.substring(0, fileName.lastIndexOf('.')));
relativeFullPath = storePath + File.separator + relativeFullPath;
sysFile.setFilepath(relativeFullPath); //保存相对路径
// 上传时间
sysFile.setCreatetime(new java.util.Date());
// 扩展名
sysFile.setExt(extName);
// 字节总数
int len = content.length;
sysFile.setTotalBytes((long) len);
// 说明
sysFile.setNote("");
sysFile.setCreatorId(Long.valueOf(creatorId));
sysFile.setCreator(creator);
// 总的字节数
sysFile.setDelFlag(SysFile.FILE_NOT_DEL);
sysFile.setParentId(sysFile.getFileId());//初始版本两值一致
//类型
sysFile.setProtypeId(8L);
sysFile.setFileType("FILE");
sysFile.setFolderid(-1L);
sysFile.setFileatt(SysFile.FILEATT_TRUE);
sysFile.setShared((short) 0);
this.sysFileService.add(sysFile);
List<SysFile> sysFiles;
if (LogThreadLocalHolder.getParamerter("sysFiles") == null) {
sysFiles = new ArrayList<SysFile>();
LogThreadLocalHolder.putParamerter("sysFiles", sysFiles);
} else {
sysFiles = (List<SysFile>) LogThreadLocalHolder.getParamerter("sysFiles");
}
sysFiles.add(sysFile);
} catch (Exception e) {
e.printStackTrace();
}
return fileId.toString();
}
private String handleFileUrl(String downLoadUrl, String fileName, String security, String describe, String dimension, String creator, String creatorId) {
Long fileId = UniqueIdUtil.genId();
try {
// 附件保存路径
String saveType = PropertyUtil.getSaveType();
String msg="";//返回执行情况
long typeId = -1; //globalType分类的id
long dataId = 0; //业务表记录的id
long tableId = 0; //业务表的id
int maxSize=1024*1024*1024;
String storePath = "";
if(dataId==0 && tableId==0){
Calendar cal = Calendar.getInstance();
storePath= ""+cal.get(Calendar.YEAR)+File.separator+(cal.get(Calendar.MONTH)+1)+File.separator+cal.get(Calendar.DAY_OF_MONTH);
} else {
storePath = ""+ tableId + File.separator + dataId; //当dataId为0时都是无记录的,挂在tableId下
}
GlobalType globalType = null;
if(typeId>0L){
globalType = (GlobalType)this.globalTypeService.getById(Long.valueOf(typeId));
if(dataId>0){
SysFileType sysFileType = sysFileTypeService.getFileType(Long.valueOf(typeId),dataId);
globalType = new GlobalType(sysFileType);
}
}
Long fileTypeId = (long) -1;//folder的Id
String fileFormates = "";//格式要求
boolean mark = true;
boolean fileSize=true;//文件大小符合判断
//获取上传的文件流
String extName = FileOperator.getSuffix(fileName);
String fileIndex= "1";//文件位置
if(mark&&fileSize){
List<SysParameter> fastDFS = sysParameterService.getByParamName("IS_FILE_FASTDFS");
Long id = fastDFS.get(0).getId();
String paramvalue = fastDFS.get(0).getParamvalue();
//生成加密或者说去除分号的文件名称(全称)
String relativeFullPath = FileOperator.generateFilenameNoSemicolon(fileName);
// 附件保存路径
String attachPath = AppUtil.getAttachPath();
String filePath = "";
SysFile sysFile = new SysFile();
sysFile.setFileId(fileId);
if(!dimension.equals("")){
//维度进行了设置、关闭文件类别
typeId = 0L;
globalType.setTypeId(0L);
}
//SysParameter fastDFS1 = fastDFS.get(0);
//By weilei:添加文件上传参数:密级、描述
if(CommonTools.isNullString(security)) {
security = "";
}else{
LogThreadLocalHolder.putParamerter("resourceSecretLevel",ISysUser.SECURITY_USER_MAP.get(security));
}
sysFile.setSecurity(security);
sysFile.setDescribe(describe);
sysFile.setKeywordText("");
sysFile.setDimension(dimension);
//获取系统是否加密的参数
List<SysParameter> needEncrypt = sysParameterService.getByParamName("IS_SAVE_SECURITY");
if (needEncrypt.size() > 0 && "是".equals(needEncrypt.get(0).getParamvalue())) {
//给文件是否加密属性设置为加密
sysFile.setIsEncrypt(1L);
}
filePath = SysFileUtil.createFilePath(attachPath+ File.separator+storePath + File.separator, relativeFullPath);
File file = this.downloadFile(downLoadUrl, attachPath+ File.separator+storePath + File.separator, relativeFullPath);
// end 写入物理文件
// 向数据库中添加数据 FileUtils
// 附件名称
sysFile.setFilename(fileName.substring(0, fileName.lastIndexOf('.')));
//by liubo 根据参数判断是本地存储还是分布式文件存储
if(StringUtil.isNotEmpty(paramvalue) && paramvalue.equals("1")){
sysFile.setFilepath(filePath); //保存storageServer服务器上的卷名+文件名
sysFile.setStoreWay(1L);//by yangbo 这里存储1区分是走分布式存储的
}else{
relativeFullPath = storePath + File.separator + relativeFullPath;
sysFile.setFilepath(relativeFullPath); //保存相对路径
}
// 上传时间
sysFile.setCreatetime(new java.util.Date());
// 扩展名
sysFile.setExt(extName);
// 字节总数
sysFile.setTotalBytes(file.length());
// 说明
sysFile.setNote("");
sysFile.setCreatorId(Long.valueOf(creatorId));
sysFile.setCreator(creator);
// 总的字节数
sysFile.setDelFlag(SysFile.FILE_NOT_DEL);
//挂在业务表记录下
if(dataId!= 0L)
sysFile.setDataId(String.valueOf(dataId));
if(tableId!=0L)
sysFile.setTableId(String.valueOf(tableId));
SysFileFolder folder = null;
//类型
sysFile.setProtypeId(8L);
sysFile.setFileType("FILE");
sysFile.setFolderid(-1L);
sysFile.setFileatt(SysFile.FILEATT_TRUE);
sysFile.setShared((short) 0);
this.sysFileService.add(sysFile);
List<SysFile> sysFiles;
if (LogThreadLocalHolder.getParamerter("sysFiles") == null) {
sysFiles = new ArrayList<SysFile>();
LogThreadLocalHolder.putParamerter("sysFiles", sysFiles);
} else {
sysFiles = (List<SysFile>) LogThreadLocalHolder.getParamerter("sysFiles");
}
sysFiles.add(sysFile);
}
} catch (Exception e) {
e.printStackTrace();
}
return fileId.toString();
}
/**
* 说明:根据指定URL将文件下载到指定目标位置--2020-11-3
*
* @param urlPath
* 下载路径
* @param downloadDir
* 文件存放目录
* @param fileName
* 文件全名
* @return 返回下载文件
*/
@SuppressWarnings("finally")
public static File downloadFile(String urlPath, String downloadDir,String fileName) {
File file = null;
try {
// 统一资源
URL url = new URL(urlPath);
// 连接类的父类,抽象类
URLConnection urlConnection = url.openConnection();
// http的连接类
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
//设置超时
httpURLConnection.setConnectTimeout(1000*5);
//设置请求方式,默认是GET
httpURLConnection.setRequestMethod("POST");
// 设置字符编码
httpURLConnection.setRequestProperty("Charset", "UTF-8");
// 打开到此 URL引用的资源的通信链接(如果尚未建立这样的连接)。
httpURLConnection.connect();
// 文件大小
int fileLength = httpURLConnection.getContentLength();
// 控制台打印文件大小
System.out.println("您要下载的文件大小为:" + fileLength / (1024 * 1024) + "MB");
// 建立链接从请求中获取数据
URLConnection con = url.openConnection();
BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
// 指定文件名称(有需求可以自定义)
String fileFullName = fileName;//全部名称--包括文件名和后缀
// 指定存放位置(有需求可以自定义)
String path = downloadDir + File.separatorChar + fileFullName;
file = new File(path);
// 校验文件夹目录是否存在,不存在就创建一个目录
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream out = new FileOutputStream(file);
int size = 0;
int len = 0;
byte[] buf = new byte[2048];
while ((size = bin.read(buf)) != -1) {
len += size;
out.write(buf, 0, size);
// 控制台打印文件下载的百分比情况
//System.out.println("下载了-------> " + len * 100 / fileLength + "%\n");
}
// 关闭资源
bin.close();
out.close();
System.out.println("文件下载成功!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件下载失败!");
} finally {
return file;
}
}
总结
提示:需要根据项目的实际情况,另:webservice接口不是为接口进行服务的,不必把传递文件的任务强加到webservice上,可采用FTP及其他方式。