java文件上传解析
Ⅰ java怎么用commons-fileupload实现上传文件
文件上传步骤:
1.导入jar包
common-fileupload.jar
common-io.jar
2.上传jsp页面编辑
<body>
<formaction="${pageContext.request.contextPath}/servlet/UploadHandleServlet"enctype="multipart/form-data"method="post">
上传用户:<inputtype="text"name="username"><br/>
上传文件1:<inputtype="file"name="file1"><br/>
上传文件2:<inputtype="file"name="file2"><br/>
<inputtype="submit"value="提交">
</form>
</body>
3.消息提示页面(成功or失败)
<body>
${message}
</body>
4.处理文件上传的servlet编写
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.List;
importjava.util.UUID;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadBase;
importorg.apache.commons.fileupload.ProgressListener;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
StringsavePath=this.getServletContext().getRealPath("/WEB-INF/upload");
//上传时生成的临时文件保存目录
StringtempPath=this.getServletContext().getRealPath("/WEB-INF/temp");
FiletmpFile=newFile(tempPath);
if(!tmpFile.exists()){
//创建临时目录
tmpFile.mkdir();
}
//消息提示
Stringmessage="";
try{
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
//设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
//2、创建一个文件上传解析器
ServletFileUploapload=newServletFileUpload(factory);
//监听文件上传进度
upload.setProgressListener(newProgressListener(){
publicvoipdate(longpBytesRead,longpContentLength,intarg2){
System.out.println("文件大小为:"+pContentLength+",当前已处理:"+pBytesRead);
/**
*文件大小为:14608,当前已处理:4096
文件大小为:14608,当前已处理:7367
文件大小为:14608,当前已处理:11419
文件大小为:14608,当前已处理:14608
*/
}
});
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return;
}
//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
upload.setFileSizeMax(1024*1024);
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
upload.setSizeMax(1024*1024*10);
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem>list=upload.parseRequest(request);
for(FileItemitem:list){
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
Stringname=item.getFieldName();
//解决普通输入项的数据的中文乱码问题
Stringvalue=item.getString("UTF-8");
//value=newString(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name+"="+value);
}else{//如果fileitem中封装的是上传文件
//得到上传的文件名称,
Stringfilename=item.getName();
System.out.println(filename);
if(filename==null||filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:a1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\")+1);
//得到上传文件的扩展名
StringfileExtName=filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:"+fileExtName);
//获取item中的上传文件的输入流
InputStreamin=item.getInputStream();
//得到文件保存的名称
StringsaveFilename=makeFileName(filename);
//得到文件的保存目录
StringrealSavePath=makePath(saveFilename,savePath);
//创建一个文件输出流
FileOutputStreamout=newFileOutputStream(realSavePath+"\"+saveFilename);
//创建一个缓冲区
bytebuffer[]=newbyte[1024];
//判断输入流中的数据是否已经读完的标识intlen=0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\"+filename)当中
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();//删除处理文件上传时生成的临时文件//item.delete();message="文件上传成功!";
}
}
}catch(FileUploadBase.){
e.printStackTrace();
request.setAttribute("message","单个文件超出最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(FileUploadBase.SizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("message","上传文件的总的大小超出限制的最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(Exceptione){
message="文件上传失败!";
e.printStackTrace();
}
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
privateStringmakeFileName(Stringfilename){//2.jpg
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
returnUUID.randomUUID().toString()+"_"+filename;
}
privateStringmakePath(Stringfilename,StringsavePath){
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
inthashcode=filename.hashCode();
intdir1=hashcode&0xf;//0--15
intdir2=(hashcode&0xf0)>>4;//0-15
//构造新的保存目录
Stringdir=savePath+"\"+dir1+"\"+dir2;//upload23upload35
if(!file.exists()){
file.mkdirs();
}
returndir;
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
5.编写web.xml文件(servlet的映射配置)
<servlet>
<servlet-name>UploadHandleServlet</servlet-name>
<servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHandleServlet</servlet-name>
<url-pattern>/servlet/UploadHandleServlet</url-pattern>
</servlet-mapping>
注:网上看到的,出处找不到了,望见谅!!
Ⅱ java项目,我上传dbf文件,解析文件数据保存到数据库里,数据量太大,速度太慢
您好,
ResultSet得相关参数代码片断,下面的代码对类型判断和转换还不全面,如果还有其他字段请自行添加
Java代码
try {
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
strutName = new String[columnCount];
strutType = new byte[columnCount];
rs.last();
int itemCount = rs.getRow();
rs.first();
data = new Object[itemCount][columnCount];
for (int i = 1; i <= columnCount; i++){
int type = (byte) meta.getColumnType(i);
//2是BigDecimal
if(type == 2){
strutType[i-1] = DBFField.FIELD_TYPE_N;
}
//12是String
else if(type == 12){
strutType[i-1] = DBFField.FIELD_TYPE_C;
}
//91是java.util.Date
else if(type == 91){
strutType[i-1] = DBFField.FIELD_TYPE_D;
}
strutName[i-1] = meta.getColumnName(i);
}
for (int i = 0; rs.next(); i++){
for (int j = 0; j < columnCount; j++){
Object da = rs.getObject(j+1);
if(da instanceof BigDecimal){
Double d = Double.parseDouble(da.toString());
data[i][j] = d;
}else{
data[i][j] = da;
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally{
rs = null;
}
上面采用的是传统方法进行导出dbf文件,如果大数据量导出时,就要先将文件生成到服务器端,然后从response里拿输入流,将刚生成的文件写到客户端,也就是多一个文件流写入的过程。
Ⅲ java 文件上传的代码,尽量详细一点。。。
// 这是我写的一个方法,里面只需要传两个参数就OK了,在任何地方调用此方法都可以文件上传
/**
* 上传文件
* @param file待上传的文件
* @param storePath待存储的路径(该路径还包括文件名)
*/
public void uploadFormFile(FormFile file,String storePath)throws Exception{
// 开始上传
InputStream is =null;
OutputStream os =null;
try {
is = file.getInputStream();
os = new FileOutputStream(storePath);
int bytes = 0;
byte[] buffer = new byte[8192];
while ((bytes = is.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytes);
}
os.close();
is.close();
} catch (Exception e) {
throw e;
}
finally{
if(os!=null){
try{
os.close();
os=null;
}catch(Exception e1){
;
}
}
if(is!=null){
try{
is.close();
is=null;
}catch(Exception e1){
;
}
}
}
}
Ⅳ JAVA上传解析文件我该怎么做
代码如下:
String[] fileName =zipEntryName.split("\\."); // 文件名
outPath = (descDir+"/"+zipEntryName).replaceAll("\\*", "/");//存储路径
for(int i=1;i<;i++){ //
File files = new File(outPath);
if(files.exists()){
outPath = (descDir+"/"+fileName[0]+"("+i+")."+fileName[1]).replaceAll("\\*", "/");
} else{
break;
}
}
//写入文件
InputStream in = zip.getInputStream(entry);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
int len;
while((len=in.read(buf1))>0){
out.write(buf1,0,len);
}
in.close();
out.close(); }
Ⅳ java 上传文件 问题
不用 下载相应jar包 引入就可以了 import 你懂得
Ⅵ java上传文件怎么实现的
common-fileupload是jakarta项目组开发的一个功能很强大的上传文件组件
下面先介绍上传文件到服务器(多文件上传):
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;
public class upload extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GB2312";
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置允许用户上传文件大小,单位:字节,这里设为2m
fu.setSizeMax(2*1024*1024);
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath("c://windows//temp");
//开始读取上传信息
List fileItems = fu.parseRequest(request);
// 依次处理每个上传的文件
Iterator iter = fileItems.iterator();
//正则匹配,过滤路径取文件名
String regExp=".+////(.+)$";
//过滤掉的文件类型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if((name==null||name.equals("")) && size==0)
continue;
Matcher m = p.matcher(name);
boolean result = m.find();
if (result){
for (int temp=0;temp<ERRORTYPE.LENGTH;TEMP++){
if (m.group(1).endsWith(errorType[temp])){
throw new IOException(name+": wrong type");
}
}
try{
//保存上传的文件到指定的目录
//在下文中上传文件至数据库时,将对这里改写
item.write(new File("d://" + m.group(1)));
out.print(name+" "+size+"");
}
catch(Exception e){
out.println(e);
}
}
else
{
throw new IOException("fail to upload");
}
}
}
}
catch (IOException e){
out.println(e);
}
catch (FileUploadException e){
out.println(e);
}
}
}
现在介绍上传文件到服务器,下面只写出相关代码:
以sql2000为例,表结构如下:
字段名:name filecode
类型: varchar image
数据库插入代码为:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");
代码如下:
。。。。。。
try{
这段代码如果不去掉,将一同写入到服务器中
//item.write(new File("d://" + m.group(1)));
int byteread=0;
//读取输入流,也就是上传的文件内容
InputStream inStream=item.getInputStream();
pstmt.setString(1,m.group(1));
pstmt.setBinaryStream(2,inStream,(int)size);
pstmt.executeUpdate();
inStream.close();
out.println(name+" "+size+" ");
}
。。。。。。
这样就实现了上传文件至数据库
Ⅶ java实现文件上传,代码尽量简洁~~~~~·
你说的2种方法都是很简单的,参考网上的资料都不难做出,用io流做更是基础中的基础,我说下smartupload好了,有的人是直接写在jsp上面,感觉比较乱,我一般都是写在action里面,打好jar包和配置后
SmartUpload mySmartUpload = new SmartUpload();
//如果是struts2.0或者webwork 则是mySmartUpload.initialize(ServletActionContext.getServletConfig(),ServletActionContext.getRequest(),ServletActionContext.getResponse());
mySmartUpload.initialize(servlet.getServletConfig(), request,response);
mySmartUpload.setTotalMaxFileSize(500000);
//如果上传任意文件不设置mySmartUpload.setAllowedFilesList(文件后缀名)就可以了
mySmartUpload.upload();
for (int i = 0; i < mySmartUpload.getFiles().getCount(); i++) {
com.jspsmart.upload.File file = mySmartUpload.getFiles().getFile(i);
if (file.isMissing()) continue;
file.saveAs(保存的地址 + file.getFileName(),
su.SAVE_PHYSICAL);
Ⅷ java文件上传不理解
首先给你解释length = is.read(bt)这句,这句的意思是从输入流is中读取数据,保存到数组bt中,而length这是读出数据的长度。
这你就明白为什么要创建bt这个对象了吧?是为了存放从输入流中读出的数据的。
输入流的read(byte[] bytes)方法的返回值是返回它读取的数据的长度,当输入流中的所有数据全部读取完毕之后就会返回-1.
再说os.write()方法,第一个参数是要写入到输出流的数据,这里也就是bt数组中的数据,后两个参数分别是数据的起始位置的偏移量和数据的长度,比如这里的0和length就是表示把bt数组中从0开始到length长度的数据写入到输出流os中。
BTW:
如果你用eclipse的话,把鼠标放到某一个方法上,就可以看见这个方法的javadoc了,里面基本都写明了这个方法的作用以及各个参数的作用和返回值什么的。
Ⅸ 最近做一个上传功能:要用java实现客户端上传apk文件,并用aapt工具解析出其中的相关信息返回
使用HttpURLConnection模拟上传 或 HttpClient上传,都不算太麻烦。
解析,就只好使用命令行执行,捕捉命令行的输出、解析、返回页面
Ⅹ 怎样使用javaweb实现上传视频和下载功能
文件上传就是将客户端资源,通过网路传递到服务器端。
因为文件数据比较大,必须通过文件上传才可以完成将数据保存到数据库端的操作。
文件上传的本质就是IO流操作。
演示:文件上传应该如何操作?
浏览器端:
1.method=post 只有post才可以携带大数据
2.必须使用<input type='file' name='f'>要有name属性
3.encType="multipart/form-data"
服务器端:
request对象是用于获取请求信息。
它有一个方法 getInputStream(); 可以获取一个字节输入流,通过这个流,可以读取到
所有的请求正文信息.
文件上传原理:
浏览器端注意上述三件事,在服务器端通过流将数据读取到,在对数据进行解析.
将上传文件内容得到,保存在服务器端,就完成了文件上传。
注意:在实际开发中,不需要我们进行数据解析,完成文件上传。因为我们会使用文件上传的工具,它们已经封装好的,提供API,只要调用它们的API就可以完成文件上传操作.我们使用的commons-fileupload,它是apache提供的一套开源免费的文件上传工具。
代码演示文件上传的原理:
在WebRoot下新建upload1.jsp
[html]view plain
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>MyJSP'index.jsp'startingpage</title>
</head>
<body>
<!--encType默认是application/x-www-form-urlencoded-->
<formaction="${pageContext.request.contextPath}/upload1"
method="POST"enctype="multipart/form-data">
<inputtype="text"name="content"><br>
<inputtype="file"name="f"><br><inputtype="submit"
value="上传">
</form>
</body>
</html>
packagecn.itcast.web.servlet;
importjava.io.IOException;
importjava.io.InputStream;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//System.out.println("upload1servlet......");
//通过request获取一个字节输入流,将所有的请求正文信息读取到,打印到控制台
InputStreamis=request.getInputStream();
byte[]b=newbyte[1024];
intlen=-1;
while((len=is.read(b))!=-1){
System.out.println(newString(b,0,len));
}
is.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
在web页面中添加上传输入项。
在Servlet中读取上传文件的数据,并保存在服务器硬盘中。
1、必须设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
2、必须把form的encType属性设为multipart/form-data 设置该值后,浏览器在上传文件时,并把文件数据附带在http请求消息体内,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
3、表单的提交方式要设置为post。
Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。
为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。
使用Commons-fileupload组件实现文件上传,需要导入该组件相应支撑jar包:Commons-fileupload和commons-io。commo-io不属于文件上传组件的开发jar文件,但Commons-fileupload组件从1.1版本开始,它工作时需要commons-io包的支持。
新建Upload1Servlet 路径:/upload1
[java]view plain
在浏览器端访问信息如下:
文件上传概述
实现web开发中的文件上传功能,需要完成如下二步操作:
如何在web页面中添加上传输入项?
<input type="file">标签用于在web页面中添加文件上传输入项,设置文件上传输入项时注意:
如何在Servlet中读取文件上传数据,并保存到本地硬盘中?