文件上传到服务器
????? java实现本地文件上传到服务器。
????? 实现方式:
??????????? rest接口模式提供上传服务
????? 头文件:
?????????
class="java" name="code"> @POST @Path("/upload") @Consumes("multipart/form-data") @Produces("text/plain; charset=utf-8")
?
?
?????
public synchronized String uploadDoc(MultipartFormDataInput input, @Context ServletContext servletContext) { logger.info("Began To Upload"); Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); List<InputPart> inputParts = uploadForm.get("Filedata"); //上传文件的web路径 String webPath = "/home/jike/tomcat-res1/webapps/shjkws"; // 获取Web应用的路径 (也可以通过这种方式来获取) // final String realPath = servletContext.getRealPath(updatePath); for (InputPart inputPart : inputParts) { try { //由于传输文件是以2进制的形式传输,所以通过流的方式读取文件名,避免中文名字乱码 InputPart a = uploadForm.get("Filename").get(0); InputStream is = a.getBody(InputStream.class, null); //读取一遍名字 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i = -1; while ((i = is.read()) != -1) { baos.write(i); } String fileName = baos.toString("UTF-8"); //也可以通过如下方式直接获取,不支持中文 //String fileName = uploadForm.get("Filename").get(0) // .getBodyAsString(); logger.debug("上传文件的名字:{}",fileName); //截取上传文件后缀 int pos = fileName.lastIndexOf('.'); String fileTitle = fileName.substring(0, pos);//文件名字 String fileHz = fileName.substring(pos);//文件后缀 logger.debug("上传文件名称:{} 文件后缀:{}",fileTitle,fileHz); //自定义上传到服务器的文件格式,此处我定义的格式为 //eg:知识库_故障报表20150428^20150428173419^.txt //便于servlrt导出中文文件,详见文件下载、excel导出 if (pos > 0) { fileName = "export" + File.separator + "知识库_"+fileTitle + dayFormat.format(System.currentTimeMillis()) + fileHz; } else { fileName = "export" + File.separator + "知识库_"+fileTitle + dayFormat.format(System.currentTimeMillis()); } String realFile = webPath + File.separator + fileName; //查看文件是否存在,如果有就删掉,避免重复,根据需要使用 fileOperate(realFile); //复制文件到服务器的另外位置,比如说部署了tomcat集群,挂了一个 //下载就找不到相应的路径,根据需要使用 copyFile(realFile); //生成文件 InputStream inputStream = inputPart.getBody(InputStream.class, null); File file = new File(realFile); FileUtils.copyInputStreamToFile(inputStream, file); logger.info("上传保存文件成功 返回生成的文件名:{} , 真实路径 :{}", fileName, realFile); return fileName; } catch (Exception e) { throw new RuntimeException("上传文件异常!"); } } return "没有上传文件!"; }
?
???
public void fileOperate(String realFile) { File file = new File(realFile); if (file.exists()) { logger.info("文件已经存在, 执行文件caozuo.html" target="_blank">删除操作"); file.delete(); logger.info("删除已经存在的文件, 文件名称: {}", realFile); } } public void copyFile(String realFileName) { String webp = realFileName; if (!StringUtils.isEmpty(webPath2)) { logger.info("copying file: {}", realFileName); webp = webp.replace(webPath, webPath2); File file = new File(webp); if (file.exists()) file.delete(); try { FileUtils.copyFile(new File(realFileName), new File(webp)); } catch (IOException e) { e.printStackTrace(); } logger.info("file copied: {}", webp); } }
??? 前台界面,调用接口实现即可。
????