Загрузка файла: SFTP соединение только через JSP - PullRequest
0 голосов
/ 29 июня 2018

Я хочу создать jsp, который будет отвечать за соединение с SFTP-сервером и затем отображение файлов по указанному пути (который будет введен пользователем)

Далее, я хочу создать ссылку для загрузки или кнопку, которая позволит пользователю загружать файл из списка отображаемых файлов.

Этот файл затем будет загружен либо на сервер sftp коннектор (путь: как в папке "tmp"), либо в локальный каталог пользователя.

Прогресс :: Я успешно создал соединение вместе с кодом для отображения списка файлов. Но я боролся с кодированием кнопки / ссылки, которая позволит пользователю загрузить файл, который он хочет загрузить.

  <%@page import="java.util.Collections"%>
    <%@page import="org.apache.commons.io.*"%>
    <%@page import="java.io.File"%>
    <%@page import="java.io.File"%>
    <%@page import="com.jcraft.jsch.*"%>
    <%@page import="java.util.Vector"%>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <script>
        function download(fn) {
            alert("downloading: " + fn);
        }
    </script>
    <body>
        <%
            String filname;
            String username = request.getParameter("username");
            if (null == username)
                username = "";

            String password = request.getParameter("password");
            if (null == password)
                password = "";

            String host = request.getParameter("host");
            if (null == host) {
                host = "";
            }
            String portStr = request.getParameter("port");
            if (null == portStr)
                portStr = "";
            int port = 0;
            try {
                port = Integer.parseInt(portStr);
            } catch (Exception ex) {
            }

            String folder = request.getParameter("folder");
            if (null == folder) {
                folder = "";

                String download = request.getParameter("dwnld");
                boolean flag = false;
                if (download != null) {
                    flag = true;
                }
            }
        %>

        <form method="POST">
            <table>
                <tr>
                    <th align="right">SFTPHOST</th>
                    <td><input name="host" value=<%=host%> size="50" type="text"></td>
                </tr>
                <tr>
                    <th align="right">Username</th>
                    <td><input name="username" value="<%=username%>"></td>
                </tr>
                <tr>
                    <th align="right">Password</th>
                    <td><input name="password" value="<%=password%>"
                        type="password"></td>
                </tr>
                <tr>
                    <th>Port</th>
                    <td><input type="number" name="port" size="4" value="<%=port%>" /></td>
                </tr>
                <tr>
                    <th>Working Directory</th>
                    <td><input name="folder" value="<%=folder%>" size="100" /></td>
                </tr>
                <p style="color: red">Please provide full path</p>
                <tr>
                    <td colspan="2"><input type="submit" /></td>
                </tr>
            </table>
        </form>

        <%
            if ("".equals(username.trim()) && port >= 0 && "".equals(host.trim()) && "".equals(password.trim())) {
        %>
        <%
            return;
            }
            JSch jsch = new JSch();
            Session sessionJsch = null;
            try {

                sessionJsch = jsch.getSession(username, host, port);
                sessionJsch.setConfig("StrictHostKeyChecking", "no");
                sessionJsch.setPassword(password);
                System.out.println("aapass: " + password);
                System.out.println("Establishing Connection...");
                sessionJsch.connect();
                System.out.println("Connection established.");
                System.out.println("Creating SFTP Channel.");
                Channel channel = sessionJsch.openChannel("sftp");
                channel.connect();
                ChannelSftp sftpChannel = (ChannelSftp) channel;
                System.out.println("SFTP Channel created.");
        %>

        <%
            Vector ls = sftpChannel.ls(folder);
        %>
            <table border="1" cellpadding="1" cellspacing="3">
                <tr>
                    <th>Name</th>
                    <th>Recieved Time</th>
                </tr>

                <%
                    for (Object entry : ls) {
                            ChannelSftp.LsEntry e = (ChannelSftp.LsEntry) entry;
                            System.out.println(e.getFilename());
                            SftpATTRS attrs = e.getAttrs();
                %>

                <tr>
                    <td><%=e.getFilename()%> <a
                        href="javascript:download('<%=e.getFilename()%>')">download</a></td>
                    <td><%=attrs.getMtimeString()%></td>
               </tr>
                <%
                    }
                %>

            </table>
        <%
            sftpChannel.exit();

            } finally {
                if (sessionJsch != null) {
                    sessionJsch.disconnect();
                }
            }
        %>
    </body>
    </html>

Я поделюсь тем кодом загрузки, который я хочу реализовать в jsp или через ajax, Так как весь jsp выполняется после загрузки страницы, я уверен, что мне нужно реализовать эти коды в ajax, которые позволят пользователю загружать файлы специально.

1 Ответ

0 голосов
/ 02 июля 2018

Спасибо ни за что, но решил.

Добавлены скрытые элементы, а затем проанализированы их значения ..

 <script>
    function dwnld(fuck) {
            alert("downloading: " + fuck);

            var run = "666";
            document.forms[0]['dwnldfile'].value=fuck;
            document.forms[0]['run'].value=run;
            document.forms[0].submit();
        }
    </script>
<%
String run = request.getParameter("run");
        if (null == run)
            run = "";

        String dwnldfile = request.getParameter("dwnldfile");
        if (null == dwnldfile)
            dwnldfile = ""; 
%>
    <tr>
            <td><input name="dwnldfile" value="<%=dwnldfile%> "type="hidden" /> 
            </td>
                </tr>
                <tr>
                    <td><input name="run" value="<%=run%>" type="hidden" /></td>
                </tr>

Там, где происходит отображение, добавив код ниже

<td><%="<a href='javascript:dwnld(\"" + folder + File.separator + "/" + e.getFilename()
                                    + "\");'>dld</a>"%></td>

Теперь rest устанавливает условия для загрузки и помещения файла во временную директорию sftp

.

, который будет добавлен в цикл for

<%
                        if (a.equals("666")) {
                            File file = new File(dwnldfile);
                            System.out.print("Download Successfull: " + file.getName());
                            PipedInputStream pin = new PipedInputStream(2048);
                            PipedOutputStream pout = new PipedOutputStream(pin);
                            sftpChannel.cd("/tmp");
                            String fout = "/tmp/" + file.getName();

                            sftpChannel.put(pin, fout);
                            a = "69 fuck";
                            System.out.println("finish");
                            pin.close();
                            pout.close();

                        }

                    }
            %>

Вот и удача для компиляции в правильном порядке в коде.

П.С .: Не смей удалять мой ответ.

...