文件上传功能的实现

树成 2008-10-19 12:44:37
我在实现文件上传功能的时候,总是不能够获得完整的上传数据,在网络中流的available()方法是无效的,所以我从http头的content-length属性中获得上传长度,但是当上传长度超过1M的时候获得的上传数据又不全了,请问有没有好的办法获得完整的上传数据?
...全文
419 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
树成 2008-10-19
  • 打赏
  • 举报
回复
感谢楼上几位的帮助,那些框架我知道用一些,但也不是很熟悉,我现在需求的是手工分析上传流来对上传数据进行处理,因为业务需要,我需要对流进行一些特殊处理,也许框架能够实现,但是毕竟要看许多文档,自己实现一些可能更直接一些。
我的上传要求是不使用jdk与j2ee以外的第三方包,而是自己分析上传流。

现在是要准确的获得上传流的数据长度,虽然现在有一个蠢办法,但是我觉得应该还有更好的其它办法实现的,因为我觉得我现在使用的办法在性能上存在很大问题,也可能会造成较大漏洞。
「已注销」 2008-10-19
  • 打赏
  • 举报
回复
楼主是用组件上传 还是 手工分析流内容上传
这篇文章详细地分析了上传组件COS及与其他上传组件smartUpload、FileUpload的性能对比 希望对你有帮助
http://blog.csdn.net/hingwu/archive/2007/05/14/1608624.aspx
liuyuwuwolf 2008-10-19
  • 打赏
  • 举报
回复
我在提供一种相对简单的上传文件操作
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String dir = request.getSession().getServletContext().getRealPath("/")
+ File.separator + "uploadDir";
String fileName="";
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10485760); // 10M

// fu.setRepositoryPath( "c:/b" );
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
System.out.println("得到请求内容的长度:" + request.getContentLength());
try {
List fileItems = fu.parseRequest(request);
if (fileItems.size() > 0) {
System.out.println("上传文件数目:" + fileItems.size());
}
Iterator iter = fileItems.iterator();

while (iter.hasNext()) {

FileItem item = (FileItem) iter.next();
fileName = new File(item.getName()).getName();

File destDir = new File(dir);
if (!destDir.exists()) {
destDir.mkdirs();
}
File file = new File(destDir, fileName);
item.write(file);
}

Workbook workbook = Workbook.getWorkbook(new File(dir+File.separator+fileName));
Sheet sheet = workbook.getSheet(0);
Cell cell = null;

int columnCount = sheet.getColumns();
int rowCount = sheet.getRows();
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < columnCount; j++) {

cell=sheet.getCell(j, i);
System.out.print(cell.getContents().trim());
System.out.print("\t");
}
System.out.print("\n");
}
// 关闭它,否则会有内存泄露
workbook.close();

} catch (FileUploadException e1) {
e1.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
}finally
{
File deleteFile=new File(dir+File.separator+fileName);
deleteFile.delete();

}
}
East271536394 2008-10-19
  • 打赏
  • 举报
回复
其实上传文件有蛮多的方式 ,

看看你是用哪种方式,
我用的是这种,

package com.upload;

import com.jspsmart.upload.SmartUpload;
/*****
*
*author:East(张栋芳)
*date: 2008-7-19
*note: 上传文件和下载文件
*/

public class Upload {

/***
*
*上传文件平
*/
public void upLoad(){
// 新建一个SmartUpload对象
SmartUpload supload = new SmartUpload();
// 上传初始化
supload.initialize(pageContext);
// 限制每个上传文件的最大长度
supload.setMaxFileSize(10000);
// 限制总上传数据的长度。
supload.setTotalMaxFileSize(20000);
// 设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。
supload.setAllowedFilesList("doc,txt");
// 设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,
//jsp,htm,html扩展名的文件和没有扩展名的文件。
supload.setDeniedFilesList("exe,bat,jsp,html,htm");
// 上传文件
supload.upload();
// 将上传文件全部保存到指定目录
int count = supload.save("/upload");

com.jspsmart.upload.SmartFile file = supload.getFiles().getFile(0);
//文件名
String fileName = file.getFieldName();
}

/***
*
*下载文件
*/
public void downLoad(){
SmartUpload su = new SmartUpload();
su.initialize(pageContext);
// 设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,
//浏览器将用acrobat打开

su.setContentDisposition(null);
su.downloadFile("/upload/test.doc");
}

}
miluboy 2008-10-19
  • 打赏
  • 举报
回复
public ActionForward doAdd(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
GoodsForm goodsForm = (GoodsForm) form;// TODO Auto-generated method stub
FormFile picFile = goodsForm.getPicFile();
//得到唯一的文件名
String fn = "uploadfiles/" + this.getUniqueName(picFile.getFileName());
//得到物理路径
ServletContext application = request.getSession().getServletContext();
String realPath = application.getRealPath("/" + fn);
System.out.println(realPath);
//保存
FileOutputStream os = new FileOutputStream(realPath);
os.write(picFile.getFileData());
os.close();
//设置实体类的相关属性
goodsForm.getGoods().setPic(fn);
System.out.println("保存至数据库的路径:"+fn);

//调用业务类对Goods类进行处理
response.getWriter().println("<img src='"+fn+"' >");

return null;
}

String getUniqueName(String oldName)
{
int dotIndex = oldName.lastIndexOf(".");
String extName = "";
if( dotIndex >= 0 )
extName = oldName.substring(dotIndex);

return df.format(new Date()) + extName;
}

static SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
}


但愿能帮上你

81,094

社区成员

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

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