长期搜索者,第一次问堆栈溢出的问题。我似乎总是能通过搜索找到我的答案,除了这次:)
我是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的初学者。我可能没有使用正确的方法,接受建议。
谢谢迈克
我明白了,我需要在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
本文向大家介绍微信小程序上传文件到阿里OSS教程,包括了微信小程序上传文件到阿里OSS教程的使用技巧和注意事项,需要的朋友参考一下 前言 (一)开通OSS服务与新建Bucket 开通OSS服务这里省略,新建bucket。 (二)设置Bucket属性,后台配置域名 上传文件访问域名 这里我们要在小程序后台配置上传域名(上面的域名是我自己的申请的,后台配置的是公司的的域名,使用的时候你们用一套东西即可