java异步文件上传(Java从本地扫描文件上传服务器)

项目说明:

本代码只是一个简单的工具类,自己做的整合,采用sftp方式进行上传文件,如有错误,望指正!!!

功能:

1.读取本地指定文件夹的文件,进行扫描读取

2.将读取的文件上传至指定服务器的指定文件夹下

3.将上传的文件以二维码的方式输出到本地

3.1.二维码可以直接扫描下载或者观看

3.2.由于使用google的zxing设置utf-8后无效果,所以转换思维到将汉字生成汉语拼音的形式去生成二维码

3.3.生成二维码上方会显示生成的内容

实现代码:

服务器配置:

打开"/usr/local/tomcat/conf/server.xml"文件添加一下配置:

例如:

服务器位置是:http://ip:8080/usr/local/pipixia/1.png

配置之后直接访问:http://ip:8080/pipixia/1.png 即可

java异步文件上传(Java从本地扫描文件上传服务器)(1)

java异步文件上传(Java从本地扫描文件上传服务器)(2)

​编辑

1.引入需求的maven

<!--汉字转拼音--> <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.0</version> </dependency> <!--sftp文件上传--> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!--end--> <!--google生成二维码--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.0.0</version> </dependency> <!--end-->

java异步文件上传(Java从本地扫描文件上传服务器)(3)

2.配置文件:ftp.properties,我这里用的是老方法,也可以使用@value注解获取yml文件的值

在resources中添加此文件

#服务器ip ip = 你的服务器ip #服务器登录用户名 user = 你的服务器登录用户 #登录密码 password = 你的服务器密码 #端口--默认22 port = 22 #服务器端储存文件的位置 FilePath = /usr/local/ #本地需要上传文件位置 localPath = E:/Ruanjian/ #本地生成二维码保存地址 QRcodePath = E:/QRcode/

java异步文件上传(Java从本地扫描文件上传服务器)(4)

3.工具类:扫描指定文件目录下的文件

//扫描文件夹下面的文件 public static File[] getFile() throws IOException { Properties properties = new Properties(); InputStream in = getQR.class.getResourceAsStream("/ftp.properties"); BufferedReader bf = new BufferedReader(new InputStreamReader(in)); properties.load(bf); String path = properties.getProperty("localPath"); File file = new File(path); //list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 //listFiles()方法是返回某个目录下所有文件和目录的绝对路径,返回的是File数组 File[] files = file.listFiles(); return files; }

java异步文件上传(Java从本地扫描文件上传服务器)(5)

4.工具类:将文件内容转换成byte[ ]类型

//将文件内容转成byte类型 public static byte[] File2byte(File tradeFile){ byte[] buffer = null; try { FileInputStream fis = new FileInputStream(tradeFile); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } return buffer; }

java异步文件上传(Java从本地扫描文件上传服务器)(6)

5.工具类:上传文件至指定服务器,上传成功返回”ture“

//上传文件至服务器指定位置 public static String uploadFile(String fileName, String fileType) throws Exception { Properties properties = new Properties(); InputStream in = getQR.class.getResourceAsStream("/ftp.properties"); BufferedReader bf = new BufferedReader(new InputStreamReader(in)); properties.load(bf); File file = new File(properties.getProperty("localPath") fileName "." fileType); byte[] bytes = File2byte(file); String ip = properties.getProperty("ip"); String user = properties.getProperty("user"); String password = properties.getProperty("password"); int port= Integer.parseInt(properties.getProperty("port")); Session session = null; Channel channel = null; JSch jsch = new JSch(); if(port <=0){ //连接服务器,采用默认端口 session = jsch.getSession(user, ip); }else{ //采用指定的端口连接服务器 session = jsch.getSession(user, ip ,port); } //如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } //设置登陆主机的密码 session.setPassword(password);//设置密码 //设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //设置登陆超时时间 session.connect(30000); OutputStream outstream = null; try { //创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; //进入服务器指定的文件夹 sftp.cd(properties.getProperty("filePath")); //列出服务器指定的文件列表 // Vector v = sftp.ls("*"); // for(int i=0;i<v.size();i ){ // System.out.println(v.get(i)); // } log.info(fileName "." fileType "---正在上传中......"); //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换一下流就可以了 String pinyin = getQR.getPinyin(fileName); outstream = sftp.put(pinyin "." fileType); outstream.write(bytes); log.info(" -------------------------------- " fileName "." fileType "已上传服务器 " "服务器位置:" properties.getProperty("filePath") "/" fileName "." fileType " " "-------------------------------- "); return "ture"; } catch (Exception e) { e.printStackTrace(); return "false"; } finally { //关流操作 if(outstream != null){ outstream.flush(); outstream.close(); } if(session != null){ session.disconnect(); } if(channel != null){ channel.disconnect(); } } }

java异步文件上传(Java从本地扫描文件上传服务器)(7)

6.工具类:生成二维码

//生成二维码--通用 public static void getSoft(String filename, String fileType) throws IOException, BadHanyuPinyinOutputFormatCombination { Properties properties = new Properties(); InputStream in = getQR.class.getResourceAsStream("/ftp.properties"); BufferedReader bf = new BufferedReader(new InputStreamReader(in)); properties.load(bf); int width = 300; //定义图片宽度 int height = 300; //定义图片高度 String format = "jpg"; //定义图片格式 String pinyin = getQR.getPinyin(filename); String content = "http://ip:8080/pipixia/" pinyin "." fileType; //定义二维码内容 //定义二维码的参数 HashMap hints = new HashMap(); //白边的宽度,可取0~4 hints.put(EncodeHintType.MARGIN , 3); //设置编码 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //设置容错等级,等级越高,容量越小 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //生成二维码 try { // 生成矩阵 内容 格式 宽 高 BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); //设置路径 Path file = new File(properties.getProperty("QRcodePath") filename ".jpg").toPath(); //输出图像 MatrixToImageWriter.writeToPath(bitMatrix, format, file); log.info(" -------------------------------- " filename ".jpg二维码已生成 " "磁盘位置:" properties.getProperty("QRcodePath") filename ".jpg " "-------------------------------- "); //将二维码加上文字 getQR.addTxt(filename, fileType); } catch (Exception e) { e.printStackTrace(); } }

java异步文件上传(Java从本地扫描文件上传服务器)(8)

7.工具类:在生成二维码上方加入二维码信息

//在图片下方添加信息 public static void addTxt(String filename, String fileType) throws IOException { Properties properties = new Properties(); InputStream in = getQR.class.getResourceAsStream("/ftp.properties"); BufferedReader bf = new BufferedReader(new InputStreamReader(in)); properties.load(bf); try { //A.jpg是背景图 InputStream is = new FileInputStream(properties.getProperty("QRcodePath") filename ".jpg"); //通过JPEG图象流创建JPEG数据流解码器 JPEGImagedecoder jpegDecoder = JPEGCodec.createJPEGDecoder(is); //解码当前JPEG数据流,返回BufferedImage对象 BufferedImage buffImg = jpegDecoder.decodeAsBufferedImage(); //得到画笔对象 Graphics g = buffImg.getGraphics(); //创建你要附加的图象。 //新的头像的路径 ImageIcon imgIcon = new ImageIcon(properties.getProperty("QRcodePath") filename "1.jpg"); //得到Image对象。 Image img = imgIcon.getImage(); //将小图片绘到大图片上。 //5,300 .表示你的小图片在大图片上的位置。 g.drawImage(img, 0, 0, null); //设置颜色。 g.setColor(Color.BLACK); //最后一个参数用来设置字体的大小 Font f = new Font("黑体", Font.PLAIN, 15); Color mycolor = Color.BLACK;//new Color(0, 0, 255); g.setColor(mycolor); g.setFont(f); //10,20 表示这段文字在图片上的位置(x,y) .第一个是设置的内容。 String text = filename "." fileType; g.drawString(text, 10, 20); g.dispose(); OutputStream os; String shareFileName = properties.getProperty("QRcodePath") filename ".jpg"; os = new FileOutputStream(shareFileName); //创键编码器,用于编码内存中的图象数据。 JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os); en.encode(buffImg); is.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } }

java异步文件上传(Java从本地扫描文件上传服务器)(9)

8.主启动类:main方法中直接运行,也可以使用controller,此处只展示main方法运行效果

public static void main(String[] args) throws Exception { File[] file = getQR.getFile(); for (File fs : file){ if (!fs.isDirectory()){ String name = fs.getName(); String fileType = name.substring(name.lastIndexOf(".") 1); String fileName = name.substring(0,name.lastIndexOf(".")); String s = getQR.uploadFile(fileName, fileType); if (s.equals("ture")){ getQR.getSoft(fileName,fileType); log.info(fileName "." fileType "上传成功!!!"); }else if (s.equals("false")){ log.info(fileName "." fileType "上传失败!!请重试!!!"); }else { log.info("发生未知错误,请检查代码!!!"); } }else { log.info("请添加文件以上传服务器!!!"); } } }

java异步文件上传(Java从本地扫描文件上传服务器)(10)

上传效果图:

执行显示:

java异步文件上传(Java从本地扫描文件上传服务器)(11)

java异步文件上传(Java从本地扫描文件上传服务器)(12)

​编辑

服务器端:

java异步文件上传(Java从本地扫描文件上传服务器)(13)

java异步文件上传(Java从本地扫描文件上传服务器)(14)

​编辑

生成的二维码:

java异步文件上传(Java从本地扫描文件上传服务器)(15)

java异步文件上传(Java从本地扫描文件上传服务器)(16)

​编辑

方法到此处已完结!!!

如有错误,往大神指正!!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。