java中文件上傳,下載,在線預覽

本帖內容:文件上傳,下載,在線預覽

文件在線預覽是使用PDF.js插件實現的,通過在後臺獲取文件流返回給前臺來實現文件的在線預覽。

springboot項目

目錄結構:

前臺HTML代碼:

前臺樣式就不放了,自己調節,引入jquery.js

<section class="container">
   <div class="append">
      <p  class="agr_p">
         <label>合同上傳:</label>
         <input type="file" multiple="multiple" name="fileName" id="file" value="瀏覽..." style="float: left;padding-left: 10px;"/>
         <input type="submit" value="上傳" style="display:none;" />
      </p>
      <p class="agr_p" id="files">
         <!--<lable value="" padding-left="1000px">agreement_8.txt<a>刪除</a></lable><br/>-->
      </p>
      <p  class="agr_p">
         <label></label>
         <a class="add_button " onclick="addAgreement()"> 創建</a>
      </p>
      <p  class="agr_p">
         <label></label>
         <a class="add_button " onclick="downfile()"> 下載</a>
      </p>
      <p  class="agr_p">
         <label></label>
         <a class="add_button " onclick="findFile()"> 預覽</a>
      </p>
   </div>
</section>

js代碼:

var arr=[];
$(function(){
    //文件上傳的列表展示
    $("#file").change(function () {
        var a=arr.length;
        var size=$("#file")[0].files;
        //將對象轉化爲數組
        for(var i=0,len=size.length;i<len;i++){
            arr[a+i]=size[i];
        }
        $("#files").html();
        for(var i=0;i<size.length;i++){
            $("#files").append("<div class='aaa"+(a+i)+"' style='height: 34px;line-height: 34px;padding-left: 150px;'><span style='width:300px;float: left;'>"+size[i].name+"</span><a class='dela' onclick='removeFile("+(a+i)+")'>刪除</a></div>");
        }
    });
});


//預覽文件
function findFile(){
    sessionStorage.setItem("names","123");//其他參數
    var dat=encodeURIComponent("/fileTest/findFile?newName=1547616634746.pdf&url=opt/test/");//文件名,文件相對路徑
    var urls="/findFile/web/findAgreement.html?file="+dat;
    window.location.href=urls;
}


//下載文件
function downfile(){
    window.location.href="/fileTest/downFile?fileName=123456.pdf&newName=1547616634746.pdf&url=opt/test/";
}

/*
* 文件上傳
* */
function addAgreement(){
        var formData = new FormData();
        formData.append("age","18");
        formData.append("names","天選");
        //這是另外一種封裝文件爲參數的方法
        // var size=$("#file")[0].files;
        // for(var i=0;i<size.length;i++){
        //     var name=size[i].name;
        //     var str=name.substring(name.length-3);
        //     if(str!="doc"&&str!="docx"&&str!="pdf"){
        //         alert("不可以有非doc,docx,pdf文檔");
        //         continue;
        //     }
        //     //這裏是放置文件
        //     formData.append("file",size[i]);
        // }
        for(var i=0;i<arr.length;i++){
            var name=arr[i].name;
            var index=name.lastIndexOf(".");
            var str=name.substring(index+1);
            if(str!="doc"&&str!="docx"&&str!="pdf"){
                alert("不可以有非doc,docx,pdf文檔");
                continue;
            }
            //這裏是放置文件
            formData.append("file",arr[i]);
        }

        $.ajax({
            url: "/fileTest/uploadFile",
            type: "post",
            data:formData,
            contentType:false,
            processData:false,
            success: function(data){
                alert("返回結果爲:"+data);
            }
        });
}
//文件刪除
function  removeFile(i) {
    $(".aaa"+i).hide();
    arr.splice(i, 1);//刪除某個元素
}

後臺controller代碼爲:

import com.qtong.afin.core.util.ConfigProperties;
import com.qtong.afin.core.util.ftp.Doc2Html;
import com.qtong.afin.core.util.ftp.FtpHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/fileTest")
public class FileTestController {

    /**
     *     日誌
     */
    public static Logger logger = LoggerFactory.getLogger(FileTestController.class);

    @Autowired
    ConfigProperties configProperties;

/**
 * 文件在線預覽`
 */
@RequestMapping(value = "/findFile")
@ResponseBody
public void findContract(String newName, String url,HttpServletRequest request, HttpServletResponse response){
    //h:/ftp_upload/     opt/test/    *.doc
    String path1=configProperties.getFtpDownPath()+url+newName;
    //h:/ftp_upload/      opt/test/
    String path2=configProperties.getFtpDownPath()+configProperties.getFtpPath();
    String filePri=newName.substring(newName.lastIndexOf(".")+1);//文件後綴名
    String fileName=newName.substring(0,newName.lastIndexOf("."));//文件名

    if("pdf".equals(filePri)){//查看是否是PDF文件
        File file=new File(path1);
        if (file.exists()){
            byte[] data = null;
            try {
                FileInputStream input = new FileInputStream(file);
                data = new byte[input.available()];
                input.read(data);
                response.getOutputStream().write(data);
                input.close();
            } catch (Exception e) {
                logger.info("pdf處理文件異常"+e);
            }
        }else{
            return;
        }
    }else {//非PDF文件
        File file=new File(path2+fileName+".pdf");
        if(!file.exists()){//查看之前是否轉過PDF文件,轉過則就可能存在,否則則就轉PDF文件,轉PDF文件使用軟件是openoffice(應該是這個名)
            //轉成PDF文件
            file = Doc2Html.uploadFile(path2, path1, "agreementfilepdf");
        }
        //返回文件流
        if (file.exists()){
            byte[] data = null;
            try {
                FileInputStream input = new FileInputStream(file);
                data = new byte[input.available()];
                input.read(data);
                response.getOutputStream().write(data);
                input.close();
            } catch (Exception e) {
                logger.info("pdf處理文件異常"+e);
            }
        }else{
            return;
        }
    }
}



    /**
     * 合同文件下載,非ftp下載
     */
    @RequestMapping(value = "/downFile")
    @ResponseBody
    public void download(String fileName,String newName,String url,HttpServletRequest request,HttpServletResponse response) {
        try {
            String path =configProperties.getFtpDownPath()+ url+newName;//文件所在地址,newName是實際存放的文件名
            // 讀到流中
            InputStream inStream = new FileInputStream(path);//文件的存放路徑
            // 設置輸出的格式
            response.reset();
            response.setContentType("bin");
            response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");//這裏的文件名是指客戶端下載後保存文件的文件名
            // 循環取出流中的數據
            byte[] b = new byte[100];
            int len;
            try {
                while ((len = inStream.read(b)) > 0) response.getOutputStream().write(b, 0, len);
                inStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 文件上傳
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/uploadFile")
    @ResponseBody
    public String addAgreement2(@RequestParam(value = "age", required = true)String age,
                                String names,
                                HttpServletRequest request,
                                HttpServletResponse response) {
        logger.info("接收到的參數爲:age="+age+"names="+names);//傳的其他參數
        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");//獲取前臺傳過來的文件集
        for (MultipartFile file : files) {
            if (files.isEmpty()) {//判斷文件是否非空
                continue;
            }
            //文件上傳操作
            //文件名
            //獲取文件名字  文件原名  文件新名newName
            String oldNames = file.getOriginalFilename();//獲取文件名字
            int i = oldNames.lastIndexOf(".");
            String substring = oldNames.substring(i);//截取文件後綴名
            Long l = System.currentTimeMillis();
            String fileName2 = l.toString();
            String newName = fileName2 + substring;//形成新的文件名
            //上傳路徑
            String path = configProperties.getFtpPath();
            InputStream inputStream = null;
            try {
                inputStream = file.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //執行文件上傳操作
            FtpHelper.uploadFile(configProperties.getFtpUrl(), Integer.valueOf(configProperties.getFtpPort()), configProperties.getFtpUsername(), configProperties.getFtpPassword(), path, newName, inputStream);
            Map<String, Object> map = new HashMap<>();
            map.put("oldName", oldNames);//文件原來的名字
            map.put("newName", newName);//文件的新名字
            map.put("path", path);
            logger.info(map.toString());
        }
        //根據結果返回結果集
        return "success";
    }
}

 

pdf.js工具類接收其他參數的代碼:至於文件流,在跳轉頁面的時候由PDF.js直接發起請求並獲取流了,基本無需操心,反正我也不知道它怎麼請求的,有心人可以自己找找。

FtpHelper工具類:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.log4j.Logger;

public class FtpHelper {
    public static int batch = 0;
    private static Logger log = Logger.getLogger(FtpHelper.class);

    public FtpHelper() {
    }

    public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();

        try {
            ftp.setControlEncoding("UTF-8");
            ftp.connect(url);
            boolean isLogin = ftp.login(username, password);
            log.info("-----FTPupload--------------------FTP服務器連接狀態: " + isLogin);
            log.info("-----FTPupload--------------------FTP服務器返回碼: " + ftp.getReplyCode());
            boolean ret = false;
            ret = ftp.setFileType(2);
            log.info("-----FTPupload--------------------FTP服務器連接狀態(setfiletype): " + ret);
            ret = ftp.makeDirectory(path);
            log.info("-----FTPupload--------------------FTP服務器連接狀態(makeDirectory): " + ret);
            ret = ftp.changeWorkingDirectory(path);
            log.info("-----FTPupload--------------------FTP服務器連接狀態(changeWorkingDirectory): " + ret);
            ftp.enterLocalPassiveMode();
            ret = ftp.storeFile(filename, input);
            log.info("-----FTPupload--------------------FTP服務器連接狀態(storeFile): " + ret);
            ret = ftp.logout();
            log.info("-----FTPupload--------------------FTP服務器連接狀態(logout): " + ret);
            success = true;
            log.info("-----FTPupload--------------------FTP服務器上傳文件完成");
        } catch (IOException var19) {
            log.info("-----FTPupload--------------------FTP服務器上傳文件異常: " + var19.getMessage());
            var19.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                    input.close();
                } catch (IOException var18) {
                    log.info("-----FTPupload--------------------FTP服務器上傳 uploadFile 關閉操作出錯: " + var18.getMessage());
                    var18.printStackTrace();
                }
            }

            log.info("-----FTPupload--------------------FTP服務器上傳文件結束end");
        }

        return success;
    }

    public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath, String realpath, String htout) {
        boolean success = false;
        FTPClient ftp = new FTPClient();

        try {
            boolean ret = false;
            ftp.setControlEncoding("UTF-8");
            ftp.connect(url);
            ret = ftp.login(username, password);
            log.info("-----FTPdownload--------------------FTP服務器連接狀態: " + ret);
            log.info("-----FTPdownload--------------------FTP服務器返回碼: " + ftp.getReplyCode());
            ret = ftp.changeWorkingDirectory(remotePath);
            if (htout != "") {
                ftp.changeWorkingDirectory(htout);
            }

            ftp.enterLocalPassiveMode();
            log.info("-----FTPdownload--------------------FTP服務器連接狀態(changeWorkingDirectory): " + ret);
            FTPFile[] fs = ftp.listFiles();
            log.info("-----FTPdownload--------------------FTP服務器包含文件名: " + ftp.listNames());
            FTPFile[] var13 = fs;
            int var14 = fs.length;

            for(int var15 = 0; var15 < var14; ++var15) {
                FTPFile ff = var13[var15];
                log.info("-----FTPdownload--------------------FTP服務器當前讀到的文件: " + ff.getName());
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(new File(realpath), fileName);
                    if (!localFile.getParentFile().exists()) {
                        localFile.getParentFile().mkdirs();
                    }

                    OutputStream is = new FileOutputStream(new File(new File(realpath), fileName));
                    ret = ftp.retrieveFile(ff.getName(), is);
                    log.info("-----FTPdownload--------------------FTP服務器連接狀態(retrieveFile): " + ret);
                    is.close();
                    success = true;
                }
            }

            ret = ftp.logout();
            log.info("-----FTPdownload--------------------FTP服務器連接狀態(logout): " + ret);
        } catch (Exception var27) {
            log.info("-----FTPdownload--------------------FTP服務器連接狀態(logout): " + var27.getMessage());
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException var26) {
                    ;
                }
            }

        }

        return success;
    }

    public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename) {
        boolean flag = false;
        FTPClient ftp = new FTPClient();

        try {
            boolean ret = false;
            int ret2 = false;
            ftp.setControlEncoding("UTF-8");
            ftp.connect(hostname, port);
            ret = ftp.login(username, password);
            log.info("-----ftpdel--------------------FTP服務器連接狀態: " + ret);
            log.info("-----ftpdel--------------------FTP服務器返回碼: " + ftp.getReplyCode());
            ret = ftp.changeWorkingDirectory(pathname);
            log.info("-----ftpdel--------------------FTP服務器連接狀態(changeWorkingDirectory) " + ret);
            ftp.enterLocalPassiveMode();
            int ret2 = ftp.dele(filename);
            log.info("-----ftpdel--------------------FTP服務器連接狀態(dele) " + ret2);
            ret = ftp.logout();
            log.info("-----ftpdel--------------------FTP服務器連接狀態(logout) " + ret);
            flag = true;
        } catch (Exception var18) {
            var18.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.logout();
                } catch (IOException var17) {
                    var17.printStackTrace();
                }
            }

        }

        return flag;
    }
}

 

docsHTML工具類代碼:

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.qtong.afin.core.util.ConfigurationInfo;
import org.apache.log4j.Logger;

import java.io.*;
import java.net.ConnectException;

/**
 * 將Word文檔轉換成pdf的工具類
 * 
 * 
 */
public class Doc2Html {
   private static Logger log = Logger.getLogger(Doc2Html.class);
    /**
     * 
     * @param contractWordUrl  合同是word的url
     * @param name
     * @return
     */
   public static File uploadFile(String realPath,String contractWordUrl,String name){
       File htmlString = toHtmlString(new File(contractWordUrl), realPath,name);
       log.info("轉成pdf的url;"+htmlString);
   return htmlString;
    }
   

    /**
     * 將word文檔轉換成html文檔
     * 
     * @param docFile
     *                需要轉換的word文檔
     * @param filepath
     *                轉換之後html的存放路徑
     * @return 轉換之後的html文件
     */
    public static File convert(File docFile, String filepath,String name) {
          // 創建保存html的文件
          File htmlFile = new File(filepath + "/" + name
              + ".pdf");
          log.info("創建保存html的文件:"+htmlFile);
          // 創建Openoffice連接
          OpenOfficeConnection con = new SocketOpenOfficeConnection(8100);
          try {
              // 連接
              con.connect();
          } catch (ConnectException e) {
              log.info("獲取OpenOffice連接失敗...");
              e.printStackTrace();
          }
          // 創建轉換器
          DocumentConverter converter = new OpenOfficeDocumentConverter(con);
          // 轉換文檔問html
          converter.convert(docFile, htmlFile);
         /* // 關閉openoffice連接
          con.disconnect();*/
          return htmlFile;
          }

    /**
     * 將word轉換成html文件,並且獲取html文件代碼。
     * 
     * @param docFile
     *                需要轉換的文檔
     * @param filepath
     *                文檔中圖片的保存位置
     * @return 轉換成功的html代碼
     */
    public static File toHtmlString(File docFile, String filepath,String name) {
    // 轉換word文檔
    File htmlFile = convert(docFile, filepath,name);
    // 獲取html文件流
    StringBuffer htmlSb = new StringBuffer();
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(
            new FileInputStream(htmlFile)));
        while (br.ready()) {
        htmlSb.append(br.readLine());
        }
        br.close();
        // 刪除臨時文件
       // htmlFile.delete();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // HTML文件字符串
    // 返回經過清潔的html文本
   return htmlFile;
    }
}

其中,openoffice轉換pdf文檔所需要的依賴,大概是這些,不對的自己找找,我找了好幾天,終於不報錯了。

有些jar包版本或者其他原因什麼的,可能找不到,自己想想辦法,比如:下載jar包,手動安裝到本地倉庫。

至於openoffice的安裝方法和啓動方式,自行百度,在轉換PDF之前需開啓openoffice。

pdf.js插件,自行百度下載。

<!--office文檔在線預覽-start-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-core</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter-cli</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>juh</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>jurt</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>ridl</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>unoil</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.3.1</version>
</dependency>
<!--office文檔在線預覽-end-->

OK,完事,上效果圖:

選擇文件前:

 

選擇文件後:

 

點擊創建完成文件上傳後,在本地硬盤上找到的其中一個文件:

點擊下載後:

在線預覽效果圖:

對了,我使用的瀏覽器是谷歌,不過應該沒影響。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章