文件上传的问题

lendylixt 2012-11-22 11:54:47
在网上查了些资料,
自己写了个上传文件类,
问题两个:
一、只能上传txt文件,其他类型的问题都传的不全,特别是图片文件,能明显的看到图片的下半部分有残缺
二、如果上传的文件名是中文的,获取到的文件名是乱码
高手帮我看看什么地方出的问题


package lenlib;

import java.io.*;
import java.util.*;
import java.util.regex.*;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

public class CUpLoad {
/*
* 设置:
* <form>标签内增加属性 enctype="multipart/form-data"
*
* 结果:
* request.getContentType获取到内容类型的格式如下:

multipart/form-data; boundary=----WebKitFormBoundary[文件内容的边界编码]

*
* request.getInputStream()转换为字符串后的格式如下:

------WebKitFormBoundary[文件内容的边界编码]
Content-Disposition: form-data; name="[上传表单内file控件的id]"; filename="[上传文件名].[扩展名]"
Content-Type: text/plain

[文件内容]
------WebKitFormBoundary[文件内容的边界编码]--

*
*/

private HttpServletRequest request;
private String sourcefilename; //上传文件原文件名
private String fileext; //上传文件扩展名
private int filesize; //上传文件的大小
private String todirurl; //保存目标文件的路径
private String tofilename; //保存目标文件文件名

public CUpLoad(HttpServletRequest request,String todirurl,String tofilename)
{
this.request=request;
this.todirurl=todirurl;
this.tofilename=tofilename;
}

public String getSourcefilename()
{
return sourcefilename;
}
public String getFileext()
{
return fileext;
}
public int getFilesize()
{
return filesize;
}

public String upload()
{
String strReturn="";
if (request==null) return "未能获取httpSevletRequest对象";
if (todirurl==null || todirurl.trim().equals("")) return "未设置文件上传路径";
if (tofilename==null || tofilename.trim().equals("")) return "未设置文件上传后使用的文件名";
String contentType=request.getContentType();
if (contentType!=null && !contentType.equals("") && contentType.indexOf("multipart/form-data;")>=0)
{
try {
int lastIndex=contentType.lastIndexOf("=");
String boundary=contentType.substring(lastIndex+1,contentType.length());
System.out.println("boundary=\n------------------\n" + boundary + "\n-------------------\n");
DataInputStream in=new DataInputStream(request.getInputStream());
int inLength=request.getContentLength();
byte dataBytes[]=new byte[inLength];
int byteRead=0;
int totalBytesRead=0;
//上传数据保存到数组中
while(totalBytesRead<inLength)
{
byteRead=in.read(dataBytes,totalBytesRead,inLength);
totalBytesRead+=byteRead;
}
String contentAll=new String(dataBytes);
System.out.println("contentAll=\n------------------------\n" + contentAll.substring(0, 1023));
System.out.println(contentAll.substring(contentAll.length()-1024) + "\n-------------------");

int startIndex=contentAll.indexOf("filename=\"") + 10; //文件名的起始位置
int endIndex=contentAll.indexOf("\"",startIndex); //文件名结束的位置
sourcefilename=contentAll.substring(startIndex,endIndex);
if (sourcefilename.lastIndexOf(".")>=0)
{
fileext=sourcefilename.substring(sourcefilename.lastIndexOf("."),sourcefilename.length());
}
else
{
fileext="";
}

startIndex=contentAll.indexOf("\n",contentAll.indexOf("\n",contentAll.indexOf("\n",endIndex)+1)+1)+1; //文件内容起始位置
endIndex=contentAll.lastIndexOf(boundary)-3; //文件内容结束位置
String content=contentAll.substring(startIndex,endIndex);
System.out.println("content=\n------------\n" + content.substring(0,1024) + content.substring(content.length()-1024) + "\n----------------");

filesize=content.getBytes().length;

File fileDir=new File(todirurl);
if (!fileDir.exists())
{
fileDir.mkdirs();
}
int startPos=contentAll.substring(0,startIndex).getBytes().length; //文件流在数据流中的起始位置
int endPos=contentAll.substring(0,endIndex).getBytes().length; //文件流在数据流中的结束位置

FileOutputStream fileOut=new FileOutputStream(todirurl + tofilename + fileext);
fileOut.write(dataBytes,startPos,(endPos-startPos));

// fileOut.write(content.getBytes());
fileOut.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "上传文件流失败!";
}

}
else
{
strReturn="上传<form>标签的类型不正确!";
}
return strReturn;
}
}


客户端页面upload.jsp调用

<%@ page import="lenlib.*" %>
<%
request.setCharacterEncoding("utf-8");
CUpLoad upload=new CUpLoad(request,"F:/123/","123456789");
System.out.println("stat=" + upload.upload());
System.out.println("fname=" + upload.getSourcefilename());
%>
<form action="upload.jsp method="post" enctype="multipart/form-data">
<font size=2>上传附件:</font>
<input type="file" id="fUpload" name="fUpload">
<input type="submit" value="上传" style="width:80px">
</form>

...全文
372 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lendylixt 2012-11-24
  • 打赏
  • 举报
回复
自己动手丰衣足食,问题解决了 自己做个一个小图片文件,1*1像素的红色点,格式jpg,大小为58字节 然后分别用request.getInputStream()和InputStream(new File("****"))获取流的bytes[] 可以发现文件流在上传数据流中的位置,找出文件流的上边界和下边界 通过测试发现,把二进制流转换为字符串,使用substring分割串,再找字节位置的话会有一定的误差 比如文件名中有中文字符的话,字符串的长度比字节长度要小 测试输出的数据如下: StreamLength int=241 MaxUploadLength int=8389120 sourcefilename=拷贝1.jpg sourcefilename strLen=7; bytelen=9 streamHead strLen=133; byteLen=135 ==============headOfFileInStream============ 103_34_13_10_67_111_110_116_101_110_116_45_84_121_112_101_58_32_105_109_97_103_101_47_106_112_101_103_13_10_13_10_ ================================= 66_77_58_0_0_0_0_0_0_0_54_0_0_0_40_0_0_0_1_0_0_0_1_0_0_0_1_0_24_0_0_0_ ================================= ==============tailOfFileInStream============ 1_0_24_0_0_0_0_0_4_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_-125_127_-11_0_ ================================= 13_10_45_45_45_45_45_45_87_101_98_75_105_116_70_111_114_109_66_111_117_110_100_97_114_121_101_88_51_118_105_110_ ================================= filesize=58 stat=上传成功! filesize=58 =================headOfFile====================== 66_77_58_0_0_0_0_0_0_0_54_0_0_0_40_0_0_0_1_0_0_0_1_0_0_0_ ============tailOfFile=========== 1_0_24_0_0_0_0_0_4_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_-125_127_-11_0_ =======================================
student_2008 2012-11-23
  • 打赏
  • 举报
回复
引用 10 楼 sl475900947 的回复:
http://d7.qjwm.com/download.aspx?down=ok&filepath=leoadmin2134%2fuploadDemo.zip commons-fileupload 的Demo,内含jar. 这个是已经封装好的上传,直接调用就可以了。
我们项目都是用这个
默笑 2012-11-23
  • 打赏
  • 举报
回复
http://d7.qjwm.com/download.aspx?down=ok&filepath=leoadmin2134%2fuploadDemo.zip commons-fileupload 的Demo,内含jar. 这个是已经封装好的上传,直接调用就可以了。
zjj911 2012-11-22
  • 打赏
  • 举报
回复
引用 楼主 lendylixt 的回复:
在网上查了些资料, 自己写了个上传文件类, 问题两个: 一、只能上传txt文件,其他类型的问题都传的不全,特别是图片文件,能明显的看到图片的下半部分有残缺 二、如果上传的文件名是中文的,获取到的文件名是乱码 高手帮我看看什么地方出的问题 Java code?12345678910111213141516171819202122232425262728293……
具体没细看 byte dataBytes[]=new byte[1024];//试试 int byteRead=0; int totalBytesRead=0; //上传数据保存到数组中
我百了个度 2012-11-22
  • 打赏
  • 举报
回复
引用 6 楼 lendylixt 的回复:
我想用自己的方法坚持一下 请教高手request.getInputStream()获取到的数据流应该怎样截取,才能获得完整的文件数据
从流里面自己取数据还要分析数据格式,我以前搞了这个的,你可以上传一个文本文件做测试,来分析数据格式,真正的文件数据前面有许多数据信息,结尾也有信息,你需要把这些信息区分开,单独拿出文件数据,上传的文件才会完整正确
lendylixt 2012-11-22
  • 打赏
  • 举报
回复
没有自己写上传的么?
佐佑不分 2012-11-22
  • 打赏
  • 举报
回复
引用 3 楼 suibian992 的回复:
额,其实现在上传文件都用JspSmartUpload包,这个很好用,推荐你试一下
用jspsmartupload会很方便
lendylixt 2012-11-22
  • 打赏
  • 举报
回复
我想用自己的方法坚持一下 请教高手request.getInputStream()获取到的数据流应该怎样截取,才能获得完整的文件数据
lendylixt 2012-11-22
  • 打赏
  • 举报
回复
1楼的方法不行 1024个字节不能保存下整个上传的流
jason0932 2012-11-22
  • 打赏
  • 举报
回复
顶楼上 用JspSmartUpload包
suibian992 2012-11-22
  • 打赏
  • 举报
回复
额,其实现在上传文件都用JspSmartUpload包,这个很好用,推荐你试一下
我百了个度 2012-11-22
  • 打赏
  • 举报
回复
出现乱码的原因应该是tomcat,tomcat默认字符编码是iso-8859-1,是不能存中文的,要自己转码

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧