- 浏览: 43683 次
- 性别:
- 来自: 北京
最新评论
-
yxl2005play:
不支持多个文件(多个<input type=" ...
JAVA上传文件进度条的实现 -
clarck_913:
您好,我看了你附件里的代码
有点疑问。
第一,web.xm ...
JAVA上传文件进度条的实现
前一段时间朱哥一直在搞视频转换这个东东,我也一直很有兴趣,就尝试了一下。
首先是文件上传功能的完成,做得很粗糙,没有验证上传文件是否为视频文件。利用前一段时间看视频学来的部分代码很轻松搞定。
接下来,就是视频转换了,我的ffmpeg和mencoder放在d:\ffmpeg目录中,代码如下
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class CodeConven {
private static String OldPath;
private static String NewPath;
public static boolean process() {
int type = checkContentType();
boolean status = false;
if (type == 0) {
status = processFLV(OldPath);// 直接将文件转为flv文件
} else if (type == 1) {
String avifilepath = processAVI(type);
if (avifilepath == null)
return false;// avi文件没有得到
status = processFLV(avifilepath);// 将avi转为flv
}
return status;
}
private static int checkContentType() {
String type = OldPath.substring(OldPath.lastIndexOf(".") + 1,
OldPath.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String OldPath) {
File file = new File(OldPath);
if (!file.isFile()) {
return false;
}
return true;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
private static String processAVI(int type) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("d:\\ffmpeg\\mencoder");
commend.add(OldPath);
commend.add("-oac");
commend.add("lavc");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add(NewPath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return NewPath;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private static boolean processFLV(String oldfilepath) {
if (!checkfile(OldPath)) {
System.out.println(oldfilepath + " is not file");
return false;
}
List<String> commend = new java.util.ArrayList<String>();
commend.add("d:\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(oldfilepath);
commend.add("-y");
commend.add("-ab");
commend.add("32");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("800000");
commend.add("-s");
commend.add("640*480");
commend.add(NewPath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public String getOldPath() {
return OldPath;
}
public void setOldPath(String oldPath) {
OldPath = oldPath;
}
public String getNewPath() {
return NewPath;
}
public void setNewPath(String newPath) {
NewPath = newPath;
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class CodeConven {
private static String OldPath;
private static String NewPath;
public static boolean process() {
int type = checkContentType();
boolean status = false;
if (type == 0) {
status = processFLV(OldPath);// 直接将文件转为flv文件
} else if (type == 1) {
String avifilepath = processAVI(type);
if (avifilepath == null)
return false;// avi文件没有得到
status = processFLV(avifilepath);// 将avi转为flv
}
return status;
}
private static int checkContentType() {
String type = OldPath.substring(OldPath.lastIndexOf(".") + 1,
OldPath.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String OldPath) {
File file = new File(OldPath);
if (!file.isFile()) {
return false;
}
return true;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
private static String processAVI(int type) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("d:\\ffmpeg\\mencoder");
commend.add(OldPath);
commend.add("-oac");
commend.add("lavc");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add(NewPath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return NewPath;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private static boolean processFLV(String oldfilepath) {
if (!checkfile(OldPath)) {
System.out.println(oldfilepath + " is not file");
return false;
}
List<String> commend = new java.util.ArrayList<String>();
commend.add("d:\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(oldfilepath);
commend.add("-y");
commend.add("-ab");
commend.add("32");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("800000");
commend.add("-s");
commend.add("640*480");
commend.add(NewPath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public String getOldPath() {
return OldPath;
}
public void setOldPath(String oldPath) {
OldPath = oldPath;
}
public String getNewPath() {
return NewPath;
}
public void setNewPath(String newPath) {
NewPath = newPath;
}
}
写个测试类试了一下,挺好使的,转换的速度也还行。
接下来就是要在上传类上略作修改,把转换的步骤加进去就ok了。
以下是添加视频转换功能后的上传类代码:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 2431664260164700200L;
private ServletContext sc;
private String savePath;
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (item.isFormField()) {
System.out.println("表单的参数名称:" + item.getFieldName()
+ ",对应的参数值:" + item.getString("UTF-8"));
} else {
if (item.getName() != null && !item.getName().equals("")) {
System.out.println("上传文件的大小:" + item.getSize());
System.out.println("上传文件的类型:" + item.getContentType());
System.out.println("上传文件的名称:" + item.getName());
File tempFile = new File(item.getName());
File file = new File(sc.getRealPath("/") + savePath,
tempFile.getName());
item.write(file);
// System.out.println(sc.getRealPath("/") + savePath);
// request.setAttribute("upload.message", "上传文件成功!");
CodeConven cc= new CodeConven();
String oldfilename=item.getName().substring(item.getName().lastIndexOf("\\")+1,item.getName().length()).toLowerCase();
String newfilename=oldfilename.substring(0,oldfilename.lastIndexOf("."))+".flv";
String oldPath=sc.getRealPath("/") + savePath+"\\"+oldfilename;
String newPath=sc.getRealPath("/") +"output\\"+newfilename;
// System.out.println("文件名:"+item.getName());
// System.out.println("原路径:"+oldPath);
// System.out.println("转换后路径:"+newPath);
cc.setOldPath(oldPath);
cc.setNewPath(newPath);
if(cc.process()){
System.out.println("conven ok");
}
} else {
request.setAttribute("upload.message", "没有选择上传文件!");
}
}
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("upload.message", "上传文件不成功!");
}
request.getRequestDispatcher("/uploadResult.jsp").forward(request, response);
}
public void init(ServletConfig config) {
savePath = config.getInitParameter("savePath");
sc = config.getServletContext();
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 2431664260164700200L;
private ServletContext sc;
private String savePath;
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (item.isFormField()) {
System.out.println("表单的参数名称:" + item.getFieldName()
+ ",对应的参数值:" + item.getString("UTF-8"));
} else {
if (item.getName() != null && !item.getName().equals("")) {
System.out.println("上传文件的大小:" + item.getSize());
System.out.println("上传文件的类型:" + item.getContentType());
System.out.println("上传文件的名称:" + item.getName());
File tempFile = new File(item.getName());
File file = new File(sc.getRealPath("/") + savePath,
tempFile.getName());
item.write(file);
// System.out.println(sc.getRealPath("/") + savePath);
// request.setAttribute("upload.message", "上传文件成功!");
CodeConven cc= new CodeConven();
String oldfilename=item.getName().substring(item.getName().lastIndexOf("\\")+1,item.getName().length()).toLowerCase();
String newfilename=oldfilename.substring(0,oldfilename.lastIndexOf("."))+".flv";
String oldPath=sc.getRealPath("/") + savePath+"\\"+oldfilename;
String newPath=sc.getRealPath("/") +"output\\"+newfilename;
// System.out.println("文件名:"+item.getName());
// System.out.println("原路径:"+oldPath);
// System.out.println("转换后路径:"+newPath);
cc.setOldPath(oldPath);
cc.setNewPath(newPath);
if(cc.process()){
System.out.println("conven ok");
}
} else {
request.setAttribute("upload.message", "没有选择上传文件!");
}
}
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("upload.message", "上传文件不成功!");
}
request.getRequestDispatcher("/uploadResult.jsp").forward(request, response);
}
public void init(ServletConfig config) {
savePath = config.getInitParameter("savePath");
sc = config.getServletContext();
}
}
ok了,写这个主要是为了实现,具体有其他不到位的地方还请大家指正啊。
发表评论
-
Hibernate主键生成方式(转)
2008-01-29 22:05 5401) assigned 主键由外部程序负责生成,无需Hibe ... -
实现JSP页面自动跳转
2008-01-30 22:01 837HTML里增加: <meta http-e ... -
JAVA中的接口和抽象类(转)
2008-03-11 17:31 650在面向对象的概念中, ... -
JAVA错误处理大集合
2008-03-15 17:19 7690、 需要标识符 a) 不在 ... -
强!!!
2008-04-01 17:51 686Java视频教程 孙鑫Java无难事 (全12CD) http ... -
字符转换 dos 命令 JDK自带的native2ascii工具完全揭密
2008-07-14 17:27 854背景:在做Java开发的时 ... -
Acegi安全系统的配置
2008-07-17 00:42 683Acegi 的配置看起来非常复杂,但事实上在实际项目的安全应用 ... -
ACEGI配置总结(1)
2008-07-18 18:39 730Acegi配置总结 1、 在web.xml中配置conte ... -
关于Struts处理异常框架的小例子
2008-07-30 17:15 750下午搞了一下Struts处理异常的框架,不错,确实很 ... -
关于Struts的Token
2008-08-01 12:07 681请求有效性处理,使用令牌可以有效的防止重复提交。 protec ... -
六大代码问题检验你的JAVA知识(转)
2008-08-01 15:57 733你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了J ... -
Spring Security连接数据库查询实例
2008-08-04 00:46 897经过若干天断断续续地研究,终于做出了第一个sprin ... -
JAVA md5、SHA加密类
2008-08-04 20:25 861Code<!--<br /><br ... -
Hibernate获取数据方式与缓存使用
2008-08-16 11:03 671Hibernate获取数据的方式有不同的几种,其与缓存结合使用 ... -
使用AjaxTags实现自动完成
2008-09-22 09:42 1121最近搞的一个通讯录想要加一个Ajax的自动完成功能, ... -
Struts2&Jquery 新闻发布
2009-03-16 17:48 1009又一个新闻发布......比以前的更加人性化了,用到了Stru ... -
JAVA实现精确的加减乘除
2009-05-20 17:13 1130package lc.util; import java.ma ... -
JAVA上传文件进度条的实现
2009-08-03 19:46 5197很久不在这里发帖子了,最近在家闲来无事,想到转视频的那东西又要 ... -
利用commonsfileupload+ffmpeg+mencoder完成视频的上传与转换(2)
2009-08-04 17:45 955这两天完善了一下视频 ... -
利用commons upload+ffmpeg+mencoder完成视频的上传与转换
2008-07-31 16:41 916前一段时间朱哥一直在搞视频转换这个东东,我也一直很有 ...
相关推荐
commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-...
在文件上传过程中,`commons-fileupload`负责解析请求,找到包含文件的Part,并将其转换为FileItem对象。FileItem对象封装了文件的相关信息,如名称、内容、是否是文件等。以下是一个基本的使用示例: ```java ...
本资源是打包好的一套demo实例,适用于64位jre。如需32位请自行更换jre包或引用路径,同时更换支持32位的prunsrv.exe,相关32位和64位的工具请下载我的资源 commons Daemon+Procrun
Apache commons所有的包已经源码,包括commons-attributes-2.2.zip commons-beanutils-1.8.0-BETA.zip,commons-betwixt-0.8.zip, commons-chain-1.2-bin.zip,commons-cli-1.1.zip,commons-codec-1.3.zip等等,...
commonfileupload 一般上传运用的SmartUpload 和...commons upload 使用缓存 上传限制减少 关键字:图片上传 文件上传 代码调试过了 没什么问题 注释也不少 其实多数还是网上的资源 只不过加工了下 让跑起来而已
在Java开发中,文件上传是一项常见的任务,Apache Commons项目中的`commons-upload`模块就是为了简化这一过程而设计的。Apache Commons FileUpload是Java的一个开源库,它提供了处理HTTP请求中的多部分数据(通常...
【标题】:“my_upload+第二次重构三个java文件”是一个关于Java文件上传的项目,其中包含了作者对Apache上传包的自定义实现和优化。这个项目可能是为了配合作者在博客上发表的系列文章“java之文件上传”,以帮助...
在Java Web开发中,文件的上传与下载是常见的功能需求,尤其在构建动态网站或Web应用程序时。本教程将深入讲解如何使用Java Servlet、Apache Commons IO库(版本2.4)以及Apache Commons FileUpload库(版本1.3)来...
标题中的"commons.jar +commons-beanutils.jar"指的是Apache Commons项目中的两个核心组件:commons.jar和commons-beanutils.jar。Apache Commons是Java编程语言中的一系列小型实用程序库,为开发人员提供了各种常见...
标题 "commons-upload使用" 涉及到的是Apache Commons组件中的两个关键部分——Commons IO和Commons FileUpload,它们是Java中处理文件上传的重要工具。这篇博客文章可能详细介绍了如何利用这两个库来实现Web应用中...
在本文中,我们将深入探讨如何利用该库实现多个文件的上传功能。 一、准备工作 在使用 Apache Commons FileUpload 进行文件上传之前,你需要确保以下组件已经准备就绪: 1. **引入依赖**:首先,你需要下载并添加...
《Commons-Logging + Log4j 入门...总之,Commons-Logging与Log4j的组合提供了强大且灵活的日志解决方案,能够满足各种规模和类型的Java应用的需求。正确理解和使用这两个工具,将大大提升你的开发效率和问题排查能力。
这个库极大地扩展了Java标准库中对输入/输出操作的支持,包括读写文件、复制流、处理字符串与字节流之间的转换、检测文件是否存在、读取文件内容、进行文件比较等等。 这四个库在Java Web开发中扮演着重要的角色,...
【Jakarta Commons 学习】 Jakarta Commons 是一个由 Apache 软件基金会维护的 Java 开源项目集合,它提供了...通过深入学习 Jakarta Commons,Java 开发者可以更好地掌握和利用这些工具,提高代码质量和开发效率。
在实际应用中,DBCP利用Commons Pool提供的对象池机制来管理数据库连接。开发者可以通过配置DBCP的DataSource来设定连接池的各种参数,如初始连接数、最大连接数、空闲超时时间等。然后,应用程序可以通过DataSource...
在本文中,我们将深入探讨如何使用Apache Commons FileUpload组件来实现文件上传功能。Apache Commons FileUpload是一个用于处理HTTP请求中的多部分数据的Java库,它使得在Servlet或JSP应用中处理文件上传变得简单易...
Apache Commons FileUpload与Apache Commons IO是Java开发中用于处理文件上传功能的重要库。这两个库的组合在处理HTTP请求中的文件上传部分尤其有用,特别是在Web应用中。下面将详细阐述这两个库的功能、使用方法...
例如,当文件上传完成后,我们可以使用Commons-IO的工具类将文件移动到目标位置,或者进行进一步的处理。这两个组件极大地简化了Java Web开发中的文件操作,提高了开发效率。在初学者的项目中,它们是不可或缺的工具...
Apache Commons Lang 是一个Java工具包,它为Java SE平台提供了许多实用功能,极大地扩展了Java标准库的功能。这个API包含了`org.apache.commons.lang`包及其子包中的所有组件,为开发者提供了一系列强大的类和方法...