java上传文件用什么 java上传文件怎么实现的
本篇文章给大家谈谈java上传文件用什么,以及java上传文件怎么实现的对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
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实现多文件上传
即使再多文件也是通过的单个文件逐次上传的(zip等压缩包实际上是一个文件)。实现思路就是将多个文件循环进行上传,上传方法举例:
/**
*上传文件
*
*@param fileName
*@param plainFilePath文件路径路径
*@param filepath
*@return
*@throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception{
FileInputStream fis= null;
ByteArrayOutputStream bos= null;
FTPClient ftpClient= new FTPClient();
String bl="false";
try{
fis= new FileInputStream(plainFilePath);
bos= new ByteArrayOutputStream(fis.available());
byte[] buffer= new byte[1024];
int count= 0;
while((count= fis.read(buffer))!=-1){
bos.write(buffer, 0, count);
}
bos.flush();
Log.info("加密上传文件开始");
Log.info("连接远程上传服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
FTPFile[] fs;
fs= ftpClient.listFiles();
for(FTPFile ff: fs){
if(ff.getName().equals(filepath)){
bl="true";
ftpClient.changeWorkingDirectory("/"+filepath+"");
}
}
Log.info("检查文件路径是否存在:/"+filepath);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon("查询文件路径不存在:"+"/"+filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info("上传文件成功:"+fileName+"。文件保存路径:"+"/"+filepath+"/");
return bl;
} catch(Exception e){
throw e;
} finally{
if(fis!= null){
try{
fis.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
if(bos!= null){
try{
bos.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
备注:只需要修改上传的服务器地址、用户名、密码即可进行服务器访问上传。根据实际需要修改即可。
java web 大文件上传下载
直接把大文件读取为IO流,之后进行上传下载即可,不用担心文件大,是可以分流下载上传的(setBufferSize(1024))。
举例:
import hkrt.b2b.view.util.Log;
import hkrt.b2b.view.util.ViewUtil;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class CCFCCBFTP{
/**
*上传文件
*
*@param fileName
*@param plainFilePath明文文件路径路径
*@param filepath
*@return
*@throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception{
FileInputStream fis= null;
ByteArrayOutputStream bos= null;
FTPClient ftpClient= new FTPClient();
String bl="false";
try{
fis= new FileInputStream(plainFilePath);
bos= new ByteArrayOutputStream(fis.available());
byte[] buffer= new byte[1024];
int count= 0;
while((count= fis.read(buffer))!=-1){
bos.write(buffer, 0, count);
}
bos.flush();
Log.info("加密上传文件开始");
Log.info("连接远程上传服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
FTPFile[] fs;
fs= ftpClient.listFiles();
for(FTPFile ff: fs){
if(ff.getName().equals(filepath)){
bl="true";
ftpClient.changeWorkingDirectory("/"+filepath+"");
}
}
Log.info("检查文件路径是否存在:/"+filepath);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon("查询文件路径不存在:"+"/"+filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info("上传文件成功:"+fileName+"。文件保存路径:"+"/"+filepath+"/");
return bl;
} catch(Exception e){
throw e;
} finally{
if(fis!= null){
try{
fis.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
if(bos!= null){
try{
bos.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
/**
*下载文件
*
*@param localFilePath
*@param fileName
*@param routeFilepath
*@return
*@throws Exception
*/
public static String fileDownloadByFtp(String localFilePath, String fileName,String routeFilepath) throws Exception{
FileInputStream fis= null;
ByteArrayOutputStream bos= null;
FileOutputStream fos= null;
FTPClient ftpClient= new FTPClient();
String SFP= System.getProperty("file.separator");
String bl="false";
try{
Log.info("下载并解密文件开始");
Log.info("连接远程下载服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
// ftpClient.connect(CMBCUtil.CMBCHOSTNAME, 2021);
// ftpClient.login(CMBCUtil.CMBCLOGINNAME, CMBCUtil.CMBCLOGINPASSWORD);
FTPFile[] fs;
ftpClient.makeDirectory(routeFilepath);
ftpClient.changeWorkingDirectory(routeFilepath);
bl="false";
fs= ftpClient.listFiles();
for(FTPFile ff: fs){
if(ff.getName().equals(fileName)){
bl="true";
Log.info("下载文件开始。");
ftpClient.setBufferSize(1024);
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
InputStream is= ftpClient.retrieveFileStream(fileName);
bos= new ByteArrayOutputStream(is.available());
byte[] buffer= new byte[1024];
int count= 0;
while((count= is.read(buffer))!=-1){
bos.write(buffer, 0, count);
}
bos.flush();
fos= new FileOutputStream(localFilePath+SFP+fileName);
fos.write(bos.toByteArray());
Log.info("下载文件结束:"+localFilePath);
}
}
Log.info("检查文件是否存:"+fileName+""+bl);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon("查询无结果,请稍后再查询。");
return bl;
}
return bl;
} catch(Exception e){
throw e;
} finally{
if(fis!= null){
try{
fis.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
if(bos!= null){
try{
bos.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
if(fos!= null){
try{
fos.close();
} catch(Exception e){
Log.info(e.getLocalizedMessage(), e);
}
}
}
}}
备注:以上方法就实现了流的二进制上传下载转换,只需要将服务器连接部分调整为本地的实际ftp服务用户名和密码即可。
OK,本文到此结束,希望对大家有所帮助。