Linux中locale设置字符集
在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中 文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置:
1. LC_COLLATE
定义该环境的排序和比较规则
2. LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。
3. LC_MONETARY
货币格式
4. LC_NUMERIC
非货币的数字显示格式
5. LC_TIME
时间和日期格式
6. LC_MESSAGES
提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如
LANGUANE=”zh_CN.GB18030:zh_CN.GB2312:zh_CN”。
7. LANG
LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。
8. LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
一个例子:
设置前,使用默认locale:
debian:~# locale
LANG=”POSIX”
LC_CTYPE=”POSIX”
LC_NUMERIC=”POSIX”
LC_TIME=”POSIX”
LC_COLLATE=”POSIX”
LC_MONETARY=”POSIX”
LC_MESSAGES=”POSIX”
LC_PAPER=”POSIX”
LC_NAME=”POSIX”
LC_ADDRESS=”POSIX”
LC_TELEPHONE=”POSIX”
LC_MEASUREMENT=”POSIX”
LC_IDENTIFICATION=”POSIX”
LC_ALL=
设置后,使用zh_CN.GDK中文locale:
debian:~# export LC_ALL=zh_CN.GBK
debian:~# locale
LANG=zh_CN.UTF-8
LC_CTYPE=”zh_CN.GBK”
LC_NUMERIC=”zh_CN.GBK”
LC_TIME=”zh_CN.GBK”
LC_COLLATE=”zh_CN.GBK”
LC_MONETARY=”zh_CN.GBK”
LC_MESSAGES=”zh_CN.GBK”
LC_PAPER=”zh_CN.GBK”
LC_NAME=”zh_CN.GBK”
LC_ADDRESS=”zh_CN.GBK”
LC_TELEPHONE=”zh_CN.GBK”
LC_MEASUREMENT=”zh_CN.GBK”
LC_IDENTIFICATION=”zh_CN.GBK”
LC_ALL=zh_CN.GBK
“C”是系统默认的locale,”POSIX”是”C”的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。
在Debian中安装locales的方法如下:
· 通过apt-get install locales命令安装locales包
· 安装完成locales包后,系统会自动进行locale配置,你只要选择所需的locale,可以多选。最后指定一个系统默认的locale。这样系统就会帮你自动生成相应的locale和配置好系统的locale。
· 增加新的locale也很简单,用dpkp-reconfigure locales重新配置locale即可。
· 我们也可手动增加locale,只要把新的locale增加到/etc/locale.gen文件中,再运行locale-gen命令即可生成新的 locale。再通过设置上面介绍的LC_*变量就可设置系统的locale了。下面是一个locale.gen文件的样例。
· # This file lists locales that you wish to have built. You can find a list
· # of valid supported locales at /usr/share/i18n/SUPPORTED. Other
· # combinations are possible, but may not be well tested. If you change
· # this file, you need to rerun locale-gen.
· #
·zh_CN.GBK GBK
·zh_CN.UTF-8 UTF-8
要在Shell中正常显示系统的中文提示信息和支持中文输入。LANG和shell的编码配置需一致,并安装有中文locale。如:LANG和 shell的编码都配置成zh_CN.utf8,并安装有zh_CN.utf8这个locale。如果shell和LANG配置不同,则中文显示乱码;如 果LANG里设置的locale没有安装,则不能显示系统的中文提示信息,只会显示英文提示信息。
Linux开机自动运行命令
本文通过对chkconfig 的介绍,为Linux 系统管理员轻松管理 /etc/rc[0-6].d 目录下众多的符号连接提供了详细的说明。那些Linux “菜鸟” 也可以通过本文了解和认知Linux 系统的运行级的概念。
不像DOS 或者 Windows,Linux 可以有多种运行级。常见的就是多用户的2,3,4,5 ,很多人知道 5 是运行 X-Windows 的级别,而 0 就是关机了。运行级的改变可以通过 init 命令来切换。例如,假设你要维护系统进入单用户状态,那么,可以使用 init 1 来切换。在Linux 的运行级的切换过程中,系统会自动寻找对应运行级的目录/etc/rc[0-6].d下的K 和 S 开头的文件,按后面的数字顺序,执行这些脚本。对这些脚本的维护,是很繁琐的一件事情,Linux 提供了chkconfig 命令用来更新和查询不同运行级上的系统服务。语法为:
chkconfig –list [name]
chkconfig –add name
chkconfig –del name
chkconfig [--level levels] name
chkconfig [--level levels] name
chkconfig 有五项功能:添加服务,删除服务,列表服务,改变启动信息以及检查特定服务的启动状态。
chkconfig 没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回 true,否则返回 false。 –level 选项可以指定要查看的运行级而不一定是当前运行级。
如果在服务名后面指定了on,off 或者 reset,那么 chkconfig 会改变指定服务的启动信息。on 和 off 分别指服务在改变运行级时的启动和停止。reset 指初始化服务信息,无论有问题的初始化脚本指定了什么。
对于 on 和 off 开关,系统默认只对运行级 3,4, 5有效,但是 reset 可以对所有运行级有效。指定 –level 选项时,可以选择特定的运行级。
需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init 不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。
选项介绍:
–level levels
指定运行级,由数字 0 到 7 构成的字符串,如:
–level 35 表示指定运行级3 和5。
–add name
这个选项增加一项新的服务,chkconfig 确保每个运行级有一项启动(S) 或者 杀死(K) 入口。如有缺少,则会从缺省的init 脚本自动建立。
–del name
用来删除服务,并把相关符号连接从 /etc/rc[0-6].d 删除。
–list name
列表,如果指定了name 那么只是显示指定的服务名,否则,列出全部服务在不同运行级的状态。
运行级文件
每个被chkconfig 管理的服务需要在对应的init.d 下的脚本加上两行或者更多行的注释。
第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 – 代替运行级。
第二行对服务进行描述,可以用 跨行注释。
例如,random.init 包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for
# higher quality random number generation.
表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80。
好了,介绍就到这里了,去看看自己/etc/rc.d/init.d 目录下的脚本吧。
设置WordPress的目录或文件权限
在各式各样的网络攻击手段层出不穷的今天,如何将恶意攻击者拒之门外,保证Web服务器的安全便成了网站能够稳定地提供服务的最基本保障。当然,网络与服务器安全是一个很大的话题,相对而言,一般性的博客网站也很难成为网络攻击者的目标,但若由此便掉以轻心则显然是不智的,毕竟,如今网络攻击的门槛越来越低,即使一个懵懵懂懂的小P孩使用随处可以找到的攻击工具也可能对我们的网站带来事实上的伤害。
那么,应如何保证我们基于WordPress博客的安全呢?
这一方面要求我们在为博客选择虚拟主机时考虑主机商的硬件设备与技术能力,确定其是否能够稳定地抵御绝大多数的网络攻击,另一方面,也需要我们正确地设置Web服务器中的目录/文件权限,不给恶意攻击者可乘之机。
从理论上来说,要保证Web服务器的安全,最简单的办法便是赋予文件最低的操作权限,比如说所有文件均为只读,而不可写不可执行,这样,攻击者便会无从下手。但在实际应用中,情况并非这么简单,以使用 WordPress搭建的博客网站来说,必须赋予某些文件的可写、可执行权限,因为WordPress自身在运行过程中需要存取、修改某些文件才能实现网站的服务功能。
对Wordpress目录/文件权限的设置,实际上就是在网站的可用性、易用性与安全性之间寻得一个恰当的平衡。下面我们具体来讨论一下(以Linux/Apache平台、WordPress位于网站根目录为例):
“/wp-admin/”: WordPress管理目录,其中的所有文件应该只赋予所有者可写权限;
“/wp-includes/”:WordPress 支持库目录,其中的所有文件应该只赋予所有者可写权限;
“/wp-content/”:这个目录下的文件权限设置相对复杂了些,让我们分别来看;
“/wp- content/themes/”:对于WordPress主题目录下的文件,如果您从不使用WordPress内置的主题编辑器,那么可以简单地设置其仅允许所有者可写;当然,对大部分朋友来说,可能常常需要修改主题如css、模板文件等,这就应赋予这些文件Apache运行用户(一般为nobody)所在组的可写权限。
而“/wp-content/plugins/”目录下存放的插件文件,同样也需视情况而定,一般而言,大部分插件可以只赋予所有者可写权限,但同样也存在部分插件需赋予Apache运行用户(一般为nobody)所在组的可写权限。
而如果要使用WordPress内置的Database Backup插件,则需要将整个“/wp-content/”目录赋予可写的权限,一般为755,在某些主机设置中甚至可能需要更高的777。
“/”:WordPress 根目录,应该只赋予所有者可写权限;不过,如果您的博客使用Permalinks,需要WordPress来自动生成、应用rewrite规则,则必须赋予Apache 对“.htaccess”的操作权限。此外,如其中内含连接wordpress 数据库的用户名与密码的“wp-config.php”,则应赋予更严格的操作控制,禁止遍历,极端情况下可直接将其设为600。
java实现删除指定目录下的所有文件
public class DelFile{
/**
* 删除指定目录下全部文件和目录
* @param filePath 需删除的文件目录路径
*/
public static void delAllFile(String filePath)
{
/**
* 指定删除目录路径构造一个文件对象
*/
File file = new File(filePath);
File[] fileList = file.listFiles();
/**
* 初始化子目录路径
*/
String dirPath = null;
if(fileList != null)
for(int i = 0 ; i < fileList.length; i++)
{
/**
* 如果是文件就将其删除
*/
if(fileList[i].isFile())
fileList[i].delete();
/**
* 如果是目录,那么将些目录下所有文件删除后再将其目录删除,
*/
if(fileList[i].isDirectory()){
dirPath = fileList[i].getPath();
//递归删除指定目录下所有文件
delAllFile(dirPath);
}
}
/**
* 删除给定根目录
*/
file.delete();
}
jsp中commons-fileupload组件实现上传下载
本文以commons-fileupload组件为例,为jsp应用添加文件上传功能。
common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。用该组件可实现一次上传一个或多个文件,并可限制文件大小。
下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps你的webappWEB-INFlib下,目录不存在请自建目录。
新建一个servlet: Upload.java用于文件上传:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class Upload extends HttpServlet {
private String uploadPath = “C:upload”; // 上传文件的目录
private String tempPath = “C:upload mp”; // 临时文件目录
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
}
}
在doPost()方法中,当servlet收到浏览器发出的Post请求后,实现文件上传。以下是示例代码:
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置最大文件尺寸,这里是4MB
fu.setSizeMax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setSizeThreshold(4096);
// 设置临时目录:
fu.setRepositoryPath(tempPath);
// 得到所有的文件:
List fileItems = fu.parseRequest(request);
Iterator i = fileItems.iterator();
// 依次处理每一个文件:
while(i.hasNext()) {
FileItem fi = (FileItem)i.next();
// 获得文件名,这个文件名包括路径:
String fileName = fi.getName();
// 在这里可以记录用户和文件信息
// …
// 写入文件,暂定文件名为a.txt,可以从fileName中提取文件名:
fi.write(new File(uploadPath + “a.txt”));
}
}
catch(Exception e) {
// 可以跳转出错页面
}
}
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
uploadPath = ….
tempPath = ….
// 文件夹不存在就自动创建:
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdirs();
if(!new File(tempPath).isDirectory())
new File(tempPath).mkdirs();
}
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcatcommonlibservlet-api.jar。
配置servlet,用记事本打开tomcatwebapps你的webappWEB-INFweb.xml,没有的话新建一个。
典型配置如下:
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
“http://java.sun.com/dtd/web-app_2_3.dtd”>
<web-app>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action=”fileupload” method=”post”
enctype=”multipart/form-data” >
<input type=”file” >
<input type=”submit” value=”upload”>
</form>
注意action=”fileupload”其中fileupload是配置servlet时指定的url-pattern。
文件的下载用servlet实现
public void doGet(HttpServletRequest request,
HttpServletResponse response)
{
String aFilePath = null; //要下载的文件路径
String aFileName = null; //要下载的文件名
FileInputStream in = null; //输入流
ServletOutputStream out = null; //输出流
try
{
aFilePath = getFilePath(request);
aFileName = getFileName(request);
response.setContentType(getContentType(aFileName) + “; charset=UTF-8″);
response.setHeader(”Content-disposition”, “attachment; filename=” + aFileName);
in = new FileInputStream(aFilePath + aFileName); //读入文件
out = response.getOutputStream();
out.flush();
int aRead = 0;
while((aRead = in.read()) != -1 & in != null)
{
out.write(aRead);
}
out.flush();
}
catch(Throwable e)
{
log.error(”FileDownload doGet() IO error!”,e);
}
finally
{
try
{
in.close();
out.close();
}
catch(Throwable e)
{
log.error(”FileDownload doGet() IO close error!”,e);
}
}
}
下面是某个大虾的代码:
这个Upload比smartUpload好用多了.完全是我一个个byte调试出来的,不象smartUpload的bug具多.
调用方法:
Upload up = new Upload();
up.init(request);
/**
此处可以调用setSaveDir(String saveDir);设置保存路径
调用setMaxFileSize(long size)设置上传文件的最大字节.
调用setTagFileName(String)设置上传后文件的名字(只对第一个文件有效)
*/
up. uploadFile();
然后String[] names = up.getFileName();得到上传的文件名,文件绝对路径应该是
保存的目录saveDir+”/”+names[i];
可以通过up.getParameter(”field”);得到上传的文本或up.getParameterValues(”filed”)
得到同名字段如多个checkBox的值.
其它的自己试试.
源码:____________________________________________________________
package com.inmsg.beans;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Upload {
private String saveDir = “.”; //要保存文件的路径
private String contentType = “”; //文档类型
private String charset = “”; //字符集
private ArrayList tmpFileName = new ArrayList(); //临时存放文件名的数据结构
private Hashtable parameter = new Hashtable(); //存放参数名和值的数据结构
private ServletContext context; //程序上下文,用于初始化
private HttpServletRequest request; //用于传入请求对象的实例
private String boundary = “”; //内存数据的分隔符
private int len = 0; //每次从内在中实际读到的字节长度
private String queryString;
private int count; //上载的文件总数
private String[] fileName; //上载的文件名数组
private long maxFileSize = 1024 * 1024 * 10; //最大文件上载字节;
private String tagFileName = “”;
public final void init(HttpServletRequest request) throws ServletException {
this.request = request;
boundary = request.getContentType().substring(30); //得到内存中数据分界符
queryString = request.getQueryString();
}
public String getParameter(String s) { //用于得到指定字段的参数值,重写request.getParameter(String s)
if (parameter.isEmpty()) {
return null;
}
return (String) parameter.get(s);
}
public String[] getParameterValues(String s) { //用于得到指定同名字段的参数数组,重写request.getParameterValues(String s)
ArrayList al = new ArrayList();
if (parameter.isEmpty()) {
return null;
}
Enumeration e = parameter.keys();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
if ( -1 != key.indexOf(s + “||||||||||”) || key.equals(s)) {
al.add(parameter.get(key));
}
}
if (al.size() == 0) {
return null;
}
String[] value = new String[al.size()];
for (int i = 0; i < value.length; i++) {
value[i] = (String) al.get(i);
}
return value;
}
public String getQueryString() {
return queryString;
}
public int getCount() {
return count;
}
public String[] getFileName() {
return fileName;
}
public void setMaxFileSize(long size) {
maxFileSize = size;
}
public void setTagFileName(String filename) {
tagFileName = filename;
}
public void setSaveDir(String saveDir) { //设置上载文件要保存的路径
this.saveDir = saveDir;
File testdir = new File(saveDir); //为了保证目录存在,如果没有则新建该目录
if (!testdir.exists()) {
testdir.mkdirs();
}
}
public void setCharset(String charset) { //设置字符集
this.charset = charset;
}
public boolean uploadFile() throws ServletException, IOException { //用户调用的上载方法
setCharset(request.getCharacterEncoding());
return uploadFile(request.getInputStream());
}
private boolean uploadFile(ServletInputStream servletinputstream) throws //取得央存数据的主方法
ServletException, IOException {
String line = null;
byte[] buffer = new byte[256];
while ( (line = readLine(buffer, servletinputstream, charset)) != null) {
if (line.startsWith(”Content-Dis;”)) {
int i = line.indexOf(”filename=”);
if (i >= 0) { //如果一段分界符内的描述中有filename=,说明是文件的编码内容
String fName = getFileName(line);
if (fName.equals(”")) {
continue;
}
if (count == 0 && tagFileName.length() != 0) {
String ext = fName.substring( (fName.lastIndexOf(”.”) + 1));
fName = tagFileName + “.” + ext;
}
tmpFileName.add(fName);
count++;
while ( (line = readLine(buffer, servletinputstream, charset)) != null) {
if (line.length() <= 2) {
break;
}
}
File f = new File(saveDir, fName);
FileOutputStream dos = new FileOutputStream(f);
long size = 0l;
while ( (line = readLine(buffer, servletinputstream, null)) != null) {
if (line.indexOf(boundary) != -1) {
break;
}
size += len;
if (size > maxFileSize) {
throw new IOException(”文件超过” + maxFileSize + “字节!”);
}
dos.write(buffer, 0, len);
}
dos.close();
}
else { //否则是字段编码的内容
String key = getKey(line);
String value = “”;
while ( (line = readLine(buffer, servletinputstream, charset)) != null) {
if (line.length() <= 2) {
break;
}
}
while ( (line = readLine(buffer, servletinputstream, charset)) != null) {
if (line.indexOf(boundary) != -1) {
break;
}
value += line;
}
put(key, value.trim(), parameter);
}
}
}
if (queryString != null) {
String[] each = split(queryString, “&”);
for (int k = 0; k < each.length; k++) {
String[] nv = split(each[k], “=”);
if (nv.length == 2) {
put(nv[0], nv[1], parameter);
}
}
}
fileName = new String[tmpFileName.size()];
for (int k = 0; k < fileName.length; k++) {
fileName[k] = (String) tmpFileName.get(k); //把ArrayList中临时文件名倒入数据中供用户调用
}
if (fileName.length == 0) {
return false; //如果fileName数据为空说明没有上载任何文件
}
return true;
}
private void put(String key, String value, Hashtable ht) {
if (!ht.containsKey(key)) {
ht.put(key, value);
}
else { //如果已经有了同名的KEY,就要把当前的key更名,同时要注意不能构成和KEY同名
try {
Thread.currentThread().sleep(1); //为了不在同一ms中产生两个相同的key
}
catch (Exception e) {}
key += “||||||||||” + System.currentTimeMillis();
ht.put(key, value);
}
}
/*
调用ServletInputstream.readLine(byte[] b,int offset,length)方法,该方法是从ServletInputstream流中读一行
到指定的byte数组,为了保证能够容纳一行,该byte[]b不应该小于256,重写的readLine中,调用了一个成员变量len为
实际读到的字节数(有的行不满256),则在文件内容写入时应该从byte数组中写入这个len长度的字节而不是整个byte[]
的长度,但重写的这个方法返回的是String以便分析实际内容,不能返回len,所以把len设为成员变量,在每次读操作时
把实际长度赋给它.
也就是说在处理到文件的内容时数据既要以String形式返回以便分析开始和结束标记,又要同时以byte[]的形式写到文件
输出流中.
*/
private String readLine(byte[] Linebyte,
ServletInputStream servletinputstream, String charset) {
try {
len = servletinputstream.readLine(Linebyte, 0, Linebyte.length);
if (len == -1) {
return null;
}
if (charset == null) {
return new String(Linebyte, 0, len);
}
else {
return new String(Linebyte, 0, len, charset);
}
}
catch (Exception _ex) {
return null;
}
}
private String getFileName(String line) { //从描述字符串中分离出文件名
if (line == null) {
return “”;
}
int i = line.indexOf(”filename=”);
line = line.substring(i + 9).trim();
i = line.lastIndexOf(”");
if (i < 0 || i >= line.length() – 1) {
i = line.lastIndexOf(”/”);
if (line.equals(”"”")) {
return “”;
}
if (i < 0 || i >= line.length() – 1) {
return line;
}
}
return line.substring(i + 1, line.length() – 1);
}
private String getKey(String line) { //从描述字符串中分离出字段名
if (line == null) {
return “”;
}
int i = line.indexOf(”>line = line.substring(i + 5).trim();
return line.substring(1, line.length() – 1);
}
public static String[] split(String strOb, String mark) {
if (strOb == null) {
return null;
}
StringTokenizer st = new StringTokenizer(strOb, mark);
ArrayList tmp = new ArrayList();
while (st.hasMoreTokens()) {
tmp.add(st.nextToken());
}
String[] strArr = new String[tmp.size()];
for (int i = 0; i < tmp.size(); i++) {
strArr[i] = (String) tmp.get(i);
}
return strArr;
}
}
下载其实非常简单,只要如下处理,就不会发生问题。
public void downLoad(String filePath,HttpServletResponse response,boolean isOnLine)
throws Exception{
File f = new File(filePath);
if(!f.exists()){
response.sendError(404,”File not found!”);
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); //非常重要
if(isOnLine){ //在线打开方式
URL u = new URL(”file:///”+filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader(”Content-Disposition”, “inline; filename=”+f.getName());
//文件名应该编码成UTF-8
}
else{ //纯下载方式
response.setContentType(”application/x-msdownload”);
response.setHeader(”Content-Disposition”, “attachment; filename=” + f.getName());
}
OutputStream out = response.getOutputStream();
while((len = br.read(buf)) >0)
out.write(buf,0,len);
br.close();
out.close();
}
jsp中FileUpload实现文件上传
要在servlet/jsp环境中实现文件上传功能非常容易,因为网上已经有许多用java开发的组件用于文件上传,本文以commons-fileupload组件为例,为servlet/jsp应用添加文件上传功能。
common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。
下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps你的webappWEB-INFlib下,如果目录不存在请自建目录。
新建一个servlet: Upload.java用于文件上传:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class Upload extends HttpServlet {
private String uploadPath = “C:upload”; // 用于存放上传文件的目录
private String tempPath = “C:upload mp”; // 用于存放临时文件的目录
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
}
}
当servlet收到浏览器发出的Post请求后,在doPost()方法中实现文件上传。以下是示例代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置最大文件尺寸,这里是4MB
fu.setSizeMax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setSizeThreshold(4096);
// 设置临时目录:
fu.setRepositoryPath(tempPath);
// 得到所有的文件:
List fileItems = fu.parseRequest(request);
Iterator i = fileItems.iterator();
// 依次处理每一个文件:
while(i.hasNext()) {
FileItem fi = (FileItem)i.next();
// 获得文件名,这个文件名包括路径:
String fileName = fi.getName();
if(fileName!=null) {
// 在这里可以记录用户和文件信息
// …
// 写入文件a.txt,你也可以从fileName中提取文件名:
fi.write(new File(uploadPath + “a.txt”));
}
}
// 跳转到上传成功提示页面
}
catch(Exception e) {
// 可以跳转出错页面
}
}
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
uploadPath = ….
tempPath = ….
// 文件夹不存在就自动创建:
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdirs();
if(!new File(tempPath).isDirectory())
new File(tempPath).mkdirs();
}
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcatcommonlibservlet-api.jar。
配置servlet,用记事本打开tomcatwebapps你的webappWEB-INFweb.xml,没有的话新建一个。典型配置如下:
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
“http://java.sun.com/dtd/web-app_2_3.dtd”>
<web-app>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action=”fileupload” method=”post” enctype=”multipart/form-data” name=”form1″>
<input type=”file” name=”file”>
<input type=”submit” name=”Submit” value=”upload”>
</form>
注意action=”fileupload”其中fileupload是配置servlet时指定的url-pattern。
jsp中文文件名无法显示的问题
现象:
http://pjzx.syty.edu.cn/UserFiles/Image/猫.jpg
浏览器中无法显示图象。
解决办法:
编辑TOMCAT配置文件server.xml,找到如下位置,加入红色部分内容,即可解决。
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ URIEncoding=”UTF-8″ useBodyEncodingForURI=”true”/>
JSP中int和String类型互相转换
1、将字串 String 转换成整数 int
两种方法:
1)int i = Integer.parseInt([String]);
或i = Integer.parseInt([String],[int radix]);
2)int i = Integer.valueOf(my_str).intValue();
注: 字串转成 Double, Float, Long 的方法大同小异。
2、将整数 int 转换成字串 String三种方法:
1) String s = String.valueOf(i);
2) String s = Integer.toString(i);
3) String s = “” + i;
注: Double, Float, Long 转成字串的方法大同小异.
Java中日期转换、加减
package com.youwei.common;
import java.text.*;
import java.util.*;
public class CDate {
public static Date toDate(String cDate) throws ParseException {
SimpleDateFormat fmt = new SimpleDateFormat(”yyyy-MM-dd”);
return fmt.parse(cDate);
}
public static Date changeDay(Date date, int offset) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_YEAR,
(calendar.get(Calendar.DAY_OF_YEAR) + offset));
return calendar.getTime();
}
}
jsp中FCKEditor的配置方法
1、解压FCKeditor_2.2.zip,(FCKeditor主文件),将FCKeditor目录复制到网站根目录下。
2、解压FCKeditor-2.3.zip,(jsp,FCKeditor整合包),作用:This is the JSP Integration Pack for using FCKeditor inside a java server page without the complexity of using a Java scriptlets or the javascript api。
3、将FCKeditor-2.3/web/WEB-INF/web.xml中的两个servlet,servlet-mapping定义复制到自已项目的web.xml文件中。
<servlet-name>Connector</servlet-name>
<url-pattern>/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-name>SimpleUploader</servlet-name>
<url-pattern>/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-name>SimpleUploader</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping>
<%@ taglib uri=”http://fckeditor.net/tags-fckeditor” prefix=”FCK” %>
//要使用的地方加入
<FCK:editor id=”content” basePath=”/FCKeditor/”
imageBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector”
linkBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector”
flashBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector”
imageUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image”
linkUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File”
flashUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash”>
this is default content :)
</FCK:editor>
2.FCKeditor根目录下只保留fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml其余全部删除
3.将editor/filemanager/upload目录下文件及文件夹清空.
4.还可以将editor/skins目录下的皮肤文件删除,只留下default一套皮肤(如果你不需要换皮肤的话)
5.还可以将editor/lang目录下文件删除,只保留en.js, fcklanguagemanager.js, zh-cn.js, zh.js文件(英文,简体中文,繁体中文一般应该够用了:) )
在struts+spring+hibernate中使用,上传图像功能中可能会出现报:
The output format must have a ‘{http://xml.apache.org/xalan}content-handler’ property!
错的情况,将WEB-INF/lib目录下xalan*.jar删除试试
假如在前台让普通用户也能使用FCKEditor,要注意相关安全问题,在前台使用时,不要使用默认的ToolBar,
要将添加图像,flash,图像域按钮去掉
在fckconfig.js中大约78行配置 那些数组中的值就像当于界面上的一个功能,你可以强行把每组值试出来代表什么。:P
- 默认分类(20)
- J2EE(25)
- Java(56)
- PHP(55)
- SEO(10)
- 网页设计(20)
- 网站建设(37)
- 数据库(7)
- JavaScript(17)
- JQuery(6)
- MySQL(20)
- SQL Server(6)
- Access(1)
- Oracle(6)
- office(6)
- Dreamweaver(4)
- Photoshop(12)
- Flash(9)
- Fireworks(13)
- CSS(14)
- HTML(4)
- .NET(7)
- ASP(2)
- DB2(1)
- Ajax(2)
- Linux(12)
- Struts(7)
- Hibernate(8)
- Spring(2)
- Jsp(22)
- Asp(8)
- C#(3)
- C++(1)
- 网络安全(5)
- 软件工程(7)
- XML(1)
- English(2)
- 计算机等级考试(2)
- 计算机病毒(4)
- 个人日志(76)
- 互联网(15)
- ActionScript(10)
- Android(3)
- 数据结构与算法(1)
- 游戏策略(3)
- 美文翻译(2)
- 编程开发(19)
- 计算机应用(4)
- 计算机(10)
- Unity3d(6)
- 其他(1)
- egret(1)