志在指尖
用双手敲打未来

java文件传输(java实现文件的上传与下载)

java文件传输

publicStringupLoadFilePost(StringactionUrl,Map<String,File>files)throwsIOException{
StringBOUNDARY=java.util.UUID.randomUUID().toString();
StringPREFIX=”–“,LINEND=”\r\n”;
StringMULTIPART_FROM_DATA=”multipart/form-data”;
StringCHARSET=”UTF-8″;
URLuri=newURL(actionUrl);
HttpURLConnectionconn=(HttpURLConnection)uri.openConnection();
conn.setReadTimeout(5*1000);
conn.setDoInput(true);//允许输入
conn.setDoOutput(true);//允许输出
conn.setUseCaches(false);
conn.setRequestMethod(“POST”);//Post方式
conn.setRequestProperty(“connection”,”keep-alive”);
conn.setRequestProperty(“Charsert”,”UTF-8″);
conn.setRequestProperty(“Content-Type”,MULTIPART_FROM_DATA
+”;boundary=”+BOUNDARY);
DataOutputStreamoutStream=newDataOutputStream(
conn.getOutputStream());
//发送文件数据
if(files!=null)
for(Map.Entry<String,File>file:files.entrySet()){
StringBuildersb1=newStringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append(“Content-Disposition:form-data;name=\”file\”;filename=\””
+file.getKey()+”\””+LINEND);
sb1.append(“Content-Type:application/octet-stream;charset=”
+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStreamis=newFileInputStream(file.getValue());
byte[]buffer=newbyte[1024];
intlen=0;
while((len=is.read(buffer))!=-1){
outStream.write(buffer,0,len);
}
is.close();
outStream.write(LINEND.getBytes());
}
//请求结束标志
byte[]end_data=(PREFIX+BOUNDARY+PREFIX+LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
//得到响应码
intres=conn.getResponseCode();
if(res==200){
InputStreamin=conn.getInputStream();
InputStreamReaderisReader=newInputStreamReader(in);
BufferedReaderbufReader=newBufferedReader(isReader);
Stringline=””;
Stringdata=””;
while((line=bufReader.readLine())!=null){
data+=line;
}
outStream.close();
conn.disconnect();
returndata;
}
outStream.close();
conn.disconnect();
returnnull;
}
服务端接收接口方法体:
publicStringfileInteraction(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
//操作成功则返回OK
Stringresult=””;
MultipartHttpServletRequestmultiRequest=(MultipartHttpServletRequest)request;
//解析request,将结果放置在list中
Map<String,List<MultipartFile>>fileMap=multiRequest.getMultiFileMap();
for(Stringkey:fileMap.keySet()){
List<MultipartFile>files=fileMap.get(key);
for(MultipartFilefile:files){
if(!file.isEmpty()){
StringfileNamePath=file.getOriginalFilename();
String[]params=fileNamePath.split(“\\.”);
Stringfilename=””;
inti=0;
for(Stringstr:params){
i=i+1;
if(StringUtils.isNotEmpty(filename)){
if(i==params.length){
filename=filename+”.”+str;
}else{
filename=filename+”/”+str;
}
}else{
filename=str;
}
}
//文件保存路径
StringfilePath=request.getSession().getServletContext().getRealPath(“/”)+”upload/wxfile/”+filename;
FileiFile=newFile(filePath);
FileiFileParent=iFile.getParentFile();
if(!iFileParent.exists()){
iFileParent.mkdirs();
}
//转存文件
file.transferTo(newFile(filePath));
result=”ok”;
}
}
}
returnresult;
}
调用客户端调用发送请求方法:
StringactionUrl=”http://shuilangyizu.iask.in/liuf/utilController/fileInteraction.do”;
Map<String,File>files=newHashMap<String,File>();
Filefile=newFile(request.getSession().getServletContext().getRealPath(“/”)+”upload/temp/1.doc”);
files.put(“x.”+file.getName(),file);
Filefile2=newFile(request.getSession().getServletContext().getRealPath(“/”)+”upload/temp/1.jpg”);
files.put(“y.”+file2.getName(),file2);
Stringresult=utilService.upLoadFilePost(actionUrl,files);java

java实现文件的上传与下载

数据上传是客户端向服务器端上传数据,客户端向服务器发送的一切恳求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。
1、上传表单要求
文件上传要求客户端提交特殊的恳求——multipart恳求,即包含多部分数据的恳求。有必要将标签的enctype特点值设为“multipart/form-data”,enctype表示encodingType,及编码类型
由于客户端上传文件的大小是不确定的,所以http协议规则,文件上传的数据要存放于恳求正文中,不能出现在URL地址栏内。也就是说,想要上传文件有必要提交POST恳求。
表单中要有标签
留意:multipart/form-data恳求与普通恳求不同
2、下载文件上传jar包并检查官方文档
打开Apache官网http://www.apache.org/,选择APACHEPROJECTLIST中的Commons
选择Commons中的FileUpload项目,并下载jar包和源文件
检查FileUpload的工作方式
检查FileUpload项目的API
3、运用第三方jar包上传文件
publicclassRegisterServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
publicRegisterServlet(){
super();
}
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.getWriter().append(“Servedat:”).append(request.getContextPath());
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//第一步、判断恳求是否为multipart恳求
if(!ServletFileUpload.isMultipartContent(request)){
thrownewRuntimeException(“当前恳求只支持文件上传”);
}
try{
//第二步、创立FileItem工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//设置临时文件存储目录
Stringpath=this.getServletContext().getRealPath(“/Temp”);
Filetemp=newFile(path);
factory.setRepository(temp);
//单位:字节。本例设置鸿沟值为2MB,超过该值会创立临时文件
factory.setSizeThreshold(1024*1024*2);
//第三步、创立文件上传中心组件
ServletFileUploadupload=newServletFileUpload(factory);
//设置item的头部字符编码,处理中文乱码问题
upload.setHeaderEncoding(“utf-8”);
//设置单个上传文件的最大值为5MB
upload.setFileSizeMax(1024*1024*5);
//设置一次上传一切文件总和的最大值为10MB(上传多个文件时起作用)
upload.setFileSizeMax(1024*1024*10);
//第四步、解析恳求获取一切的item
Listitems=upload.parseRequest(request);
//第五步、遍历item
for(FileItemitem:items){
if(item.isFormField()){
processFormField(item);
}else{
processUploadedFile(item);
}
}
}catch(FileUploadExceptione){
e.printStackTrace();
}
}
privatevoidprocessFormField(FileItemitem){
try{
Stringname=item.getFieldName();
//处理中文乱码问题
Stringvalue=item.getString(“utf-8”);
System.out.println(name+”=”+value);
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
}
privatevoidprocessUploadedFile(FileItemitem){
try{
InputStreaminputStream=item.getInputStream();
StringfieldName=item.getFieldName();
//获取上传文件原始名称
StringfileName=item.getName();
//处理文件同名问题
fileName=System.currentTimeMillis()+fileName;
StringcontentType=item.getContentType();
booleanisInMemory=item.isInMemory();
longsizeInBytes=item.getSize();
Stringpath=this.getServletContext().getRealPath(“/UploadContent”);
//Datenow=newDate();
Calendarnow=Calendar.getInstance();
//对上传的文件进行分类管理
path+=”/”+now.get(Calendar.YEAR)+”/”+(now.get(Calendar.MONTH)+1)+”/”+now.get(Calendar.DAY_OF_MONTH);
//若目录不存在,则创立该目录
Filedirectory=newFile(path);
if(!directory.exists()){
directory.mkdirs();
}
FiledescFile=newFile(path,fileName);
OutputStreamoutputStream=newFileOutputStream(descFile);
intlength=-1;
byte[]buffer=newbyte[1024];
while((length=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,length);
}
outputStream.close();
inputStream.close();
//删除临时文件
item.delete();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
Java文件下载
数据下载是客户端从服务器获取数据,服务器向客户端发送的一切呼应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。一般咱们对服务器所宣布的恳求,大多是文件下载恳求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,咱们才能看到多媒体信息。
1、超链接下载
浏览器能解析的文件会直接显现,如:pdf、jpg……
浏览器解析不了的文件会被另存为,如:rar、exe……
浏览器版别不一样,对文件的解析能力也不同
缺陷:下载内容的方式(直接显现/另存为)由浏览器决定,跟服务器无关
2、Servlet方式下载
设置呼应头部特点content-disposition值为attachment
获取衔接服务器源文件的输入流
获取输出流
将输入流中的数据写到输出流中
publicclassDownloadServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
publicDownloadServlet(){
super();
}
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//设置呼应的头部特点content-disposition值为attachment
//运用filename来指定文件名
Stringfilename=”超跑.png”;
byte[]bytes=filename.getBytes(“utf-8″);
//http协议规则浏览器只能接受ISO8859-1类型的字节数据
filename=newString(bytes,”ISO8859-1”);
response.setHeader(“content-disposition”,”attachment;filename=”+filename);
//获取衔接服务器资源文件的输入流
InputStreamis=request.getServletContext().getResourceAsStream(“/Resources/BS架构原理图1.png”);
//获取输出流
ServletOutputStreamos=response.getOutputStream();
//将输入流中的数据写到输出流中
intlength=-1;
byte[]buffer=newbyte[1024];
while((length=is.read(buffer))!=-1){
os.write(buffer,0,length);
}
os.close();
is.close();
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}

未经允许不得转载:IT技术网站 » java文件传输(java实现文件的上传与下载)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载