当前位置: 首页 > 知识库问答 >
问题:

Apache Commons FTP小程序html上传按钮

伊光赫
2023-03-14

长期搜索者,第一次问堆栈溢出的问题。我似乎总是能通过搜索找到我的答案,除了这次:)

我是Java编程的初学者。虽然我认为使用apache Commons ftp的小程序是在我的网站上实现FTP文件上传解决方案的最佳解决方案。

当我的所有代码都在init()方法中时,我就能够传输文件了。

不过,当我将代码移动到另一个方法(在javascript中调用)时,它在打印工作目录(PWD)后失败。

该代码适用于:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication2;

import java.io.IOException;
import javax.swing.JApplet;
import javax.swing.*;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.io.Util;
import org.apache.commons.net.io.CopyStreamAdapter;
import org.apache.commons.net.io.CopyStreamEvent;
import org.apache.commons.net.io.CopyStreamListener;
/**
 *
 * @author Mike
 */
public class FTPMain extends JApplet {
    int userId;
    private File[] files;
    final JPanel myPanel = new JPanel();
    final JLabel lblStatus = new JLabel();    
    final JProgressBar myProgressBar = new JProgressBar();

    //Called when this applet is loaded into the browser.
    public void init() {

        JButton btnSelectFiles = new JButton("Select Files");
        JButton btnUpload = new JButton("Upload Files");

        myPanel.add(btnSelectFiles);
        myPanel.add(btnUpload);
        myPanel.add(lblStatus);
        myPanel.add(myProgressBar);
        myPanel.setBackground(Color.white);

        btnSelectFiles.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 final JFileChooser fc = new JFileChooser();
                 fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                 fc.setMultiSelectionEnabled(true);
                 int returnVal = fc.showOpenDialog(myPanel);
                 if(returnVal == JFileChooser.APPROVE_OPTION) {
                     files = fc.getSelectedFiles(); 
                     //for(int i = 0; i < files.length; i++) {
                     lblStatus.setText("File count:  " + files.length);
                     //}
                 } else {
                    lblStatus.setText("Open command cancelled by user.");
                 }
             }
        });

        btnUpload.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                lblStatus.setText("Uploading Files...");

                final FTPClient ftpclient = new FTPClient();
                //ftpclient.setControlKeepAliveTimeout(300);
                File myFile;
                try {

                    FTPUtils.ftpConnect(ftpclient, "myhost", "myusername", "mypassword");
                    //ftpclient.enterLocalPassiveMode();
                    ftpclient.setFileType(FTP.BINARY_FILE_TYPE);

                    for(int i = 0; i < files.length; i++) {
                        String to = "/path/to/files/queue";
                        ftpclient.changeWorkingDirectory(to);
                        ftpclient.printWorkingDirectory();
                        myFile = new File(files[i].getAbsolutePath());
                        final String remoteFile = myFile.getName();
                        final InputStream inputStream = new FileInputStream(myFile);
                        final OutputStream outputStream = ftpclient.storeFileStream(remoteFile);

                        //byte[] bytesIn = new byte[4096];
                        //int read = 0;
                        int streamSize = (int)files[i].getTotalSpace();
                        Util.copyStream(inputStream, outputStream, 4096, streamSize, myListener);

                        /*while((read = inputStream.read(bytesIn)) != -1) {
                            outputStream.write(bytesIn, 0, read);
                        }*/

                        inputStream.close();
                        outputStream.close();
                        boolean completed = ftpclient.completePendingCommand();

                        if(completed) {
                            lblStatus.setText((i+1) + " files have been uploaded successfully.");
                        }
                    }
                } catch (IOException ex) {
                    // TODO Auto-generated catch block
                    lblStatus.setText(ex.getMessage());
                    //ex.printStackTrace();
                }
            }
        });

        getContentPane().add(myPanel);
    }

    public CopyStreamListener myListener = new CopyStreamListener(){
        //private long megsTotal = 0;
        public void bytesTransferred(CopyStreamEvent event) {
            bytesTransferred(event.getTotalBytesTransferred(), event.getBytesTransferred(), event.getStreamSize());
        }

        public void bytesTransferred(long totalBytesTransferred,
                int bytesTransferred, long streamSize) {

            final int percent = (bytesTransferred / (int)streamSize) * 100;
            //myProgressBar.setString("Processing " + percent + "%");
            //myProgressBar.setValue(percent);
            lblStatus.setText("Total: "+percent);
            /*long megs = totalBytesTransferred / 1000000;
            for (long l = megsTotal; l < megs; l++) {
                System.err.print("#");
            }
            megsTotal = megs;
            myLabel.setText("Total: " + megsTotal);
            myProgressBar.setValue((int)megsTotal);*/
        }
    };

    //private static CopyStreamListener createListener(){
    //    return 
    //}

    public void startFTPUpload(String strUserInfo) {

        //myLabel.setText("UserId " + userId + " is now set.");
    }
}

虽然当我将传输代码的文件(在btnUpload Action Listener中)移动到start FTPUpload方法并通过javascript运行时,它在PWD行之后失败,没有错误。

/* javascript code */
$("#btnUpload").click(function() {
    var val = $(this).val();
    var myApp = document.applets["FTPUpload"];
    if(myApp) { 
        //alert("found app");
        myApp.startFTPUpload(val);
    }                     
});
/* ----------------- */

public void startFTPUpload(String strUserInfo) {
        lblStatus.setText("Uploading Files...");

        final FTPClient ftpclient = new FTPClient();
        //ftpclient.setControlKeepAliveTimeout(300);
        File myFile;
        try {

            FTPUtils.ftpConnect(ftpclient, "myhost", "myusername", "mypassword");
            //ftpclient.enterLocalPassiveMode();
            ftpclient.setFileType(FTP.BINARY_FILE_TYPE);

            for(int i = 0; i < files.length; i++) {
                String to = "/path/to/files/queue";
                ftpclient.changeWorkingDirectory(to);
                ftpclient.printWorkingDirectory();
                myFile = new File(files[i].getAbsolutePath());
                final String remoteFile = myFile.getName();
                final InputStream inputStream = new FileInputStream(myFile);
                final OutputStream outputStream = ftpclient.storeFileStream(remoteFile);

                //byte[] bytesIn = new byte[4096];
                //int read = 0;
                int streamSize = (int)files[i].getTotalSpace();
                Util.copyStream(inputStream, outputStream, 4096, streamSize, myListener);

                /*while((read = inputStream.read(bytesIn)) != -1) {
                    outputStream.write(bytesIn, 0, read);
                }*/

                inputStream.close();
                outputStream.close();
                boolean completed = ftpclient.completePendingCommand();

                if(completed) {
                    lblStatus.setText((i+1) + " files have been uploaded successfully.");
                }
            }
        } catch (IOException ex) {
            // TODO Auto-generated catch block
            lblStatus.setText(ex.getMessage());
            //ex.printStackTrace();
        }
        //myLabel.setText("UserId " + userId + " is now set.");
    }

任何帮助都是非常感谢的,记住我是一个Java的初学者。我可能没有使用正确的方法,接受建议。

谢谢迈克

共有1个答案

督劲
2023-03-14

我明白了,我需要在AccessController中包装javascript调用的方法。doPrivileged,如下所示:

public void startFTPUpload(String strUserInfo) {
    AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
        public Boolean run() {
            try {
                final FTPClient ftpclient = new FTPClient();

                File myFile;
                try {

                    FTPUtils.ftpConnect(ftpclient, "host", "username", "password");
                    ftpclient.setFileType(FTP.BINARY_FILE_TYPE);

                    for(int i = 0; i < files.length; i++) {
                        String to = "/tekmtn.com/sites/testingsite.com/files/queue";
                        ftpclient.changeWorkingDirectory(to);
                        ftpclient.printWorkingDirectory();
                        myFile = new File(files[i].getAbsolutePath());
                        final String remoteFile = myFile.getName();

                        FTPUtils.uploadFile(ftpclient, files[i].getAbsolutePath(), remoteFile);
                        boolean completed = ftpclient.completePendingCommand();
                        if(completed) {
                            lblStatus.setText((i+1) + " files have been uploaded successfully.");
                        }
                    }
                } catch (IOException ex) {
                    // TODO Auto-generated catch block
                    lblStatus.setText(ex.getMessage());
                    //ex.printStackTrace();
                }
                //myLabel.setText("UserId " + userId + " is now set.");
            } catch (Exception e) {
                lblStatus.setText(e.getMessage());
            }
            return Boolean.TRUE;
        }
    });
}
 类似资料:
  • 本文向大家介绍微信小程序代码上传、审核发布小程序,包括了微信小程序代码上传、审核发布小程序的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了微信发布小程序的具体步骤,供大家参考,具体内容如下 1.打开微信开发者工具 管理员扫码 -> 填写好小程序的项目目录、AppID(必须是客户已注册好的AppID)、项目名称   2.在app.js中修改id(客户登录后台管理系统的id),app.j

  • 描述 (Description) HTML 标记指定了一个applet。 它用于在HTML文档中嵌入Java applet。 HTML5不支持它。 例子 (Example) <!DOCTYPE html> <html> <head> <title>HTML applet Tag</title> </head> <body> <applet code = "

  • 本文向大家介绍微信小程序实现图片上传,包括了微信小程序实现图片上传的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下/p> 图片上传服务器: wxml wxss 思路很简单,多张上传的话,在 upImgs 方法回调做判断 index++ 继续调用 upImgs方法即可 以上就是本文的全部内容,希望对大家的学习有所帮助,也希

  • 本文向大家介绍微信小程序上传图片实例,包括了微信小程序上传图片实例的使用技巧和注意事项,需要的朋友参考一下 在网上看了好多小程序上传图片,java后端接收的示例,但是不管在哪个网站看的,代码基本是一样的,都是代码特别多。 所以就自己写一个比较简单的。  一 小程序端 user.wxml user.js  二 java端 图片存在了项目的temp目录下 简单就好,没其他功能,单纯上传图片。 以上就是

  • 这个问题已经出现过好几次了,尽管似乎没有任何有效的解释。(或者也许我没有在这个叫做互联网的混乱中找到它)。。。 我正在开发一个android应用程序,它会打开一个包含上传按钮的HTML页面。它在WebView中不起作用。 我试过:http://m0s-programming.blogspot.in/2011/02/file-upload-in-through-webview-on.html 但是e

  • 本文向大家介绍微信小程序实现图片上传功能,包括了微信小程序实现图片上传功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了微信小程序实现图片上传功能的具体代码,供大家参考,具体内容如下 前端:微信开发者工具 后端:.Net 服务器:阿里云 这里介绍微信小程序如何实现上传图片到自己的服务器上 前端代码 后端上传代码(将文件上传到服务器临时文件夹内) 设置配置文件上传文件对应的文件夹信息