servlet 上传文件及此次遇见的http500问题的解决

平时在一个网页中下载文件,是可以通过servlet将其上传到网页上的。
因此以下步骤是 利用servlet来上传文件—— 同时在上传附件时也有涉及

准备upload.html(主要用于显示 上传的页面显示):

<!DOCTYPE html>
<meta http-equiv="content-type" content="text/html charset=UTF-8">
//用意是告诉浏览器编码方式是 UTF-8

<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="uploadPhoto" method="post" enctype="multipart/form-data">
    文件名称:<input type="text" name="heroName" /> <br>
    上传文件 : <input type="file" name="filepath" /> <br>
    <input type="submit" value="上传">
</form>
</body>
</html>

需要注意的是 method的提交方式一定要选择post ,get 不能上传文件enctype=“multipart/form-data” 表示提交的文件是二进制文件
action 则为.xml文件的跳转路径
需要提供type=“file” 的字段进行上传一定要注意type的类型 file才能打开文件栏

和之前的步骤一样 再准备uploadServlet.java

这里需要导入两个jar包,commons-io和commons-fileupload

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.File;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

public class UploadPhotoServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) {//必定重写的方法

        String filename = null;
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);//主要用到DiskFileItemFactory实例对象放入ServletFileUpload中进行上传文件
            // 设置上传文件的大小限制为1M
            factory.setSizeThreshold(1024 * 1024);

            List items = null;
            try {
                items = upload.parseRequest(request);//设置List容器来存储请求获取的文件
            } catch (FileUploadException e) {
                e.printStackTrace();
            }

            Iterator iter = items.iterator();//迭代器遍历
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                if (!item.isFormField()) {//如果不是普通文本表单字段

                    // 这里使用的是一种粗糙的解决文件名重复的办法,即使用时间戳。
                    filename = System.currentTimeMillis() + ".jpg";


                    String photoFolder =request.getServletContext().getRealPath("uploaded");

                    File f = new File(photoFolder, filename);
                    f.getParentFile().mkdirs();//创建父文件

                    // 通过item.getInputStream()获取浏览器上传的文件的输入流
                    InputStream is = item.getInputStream();//直到遍历出Item,一个Item就是对应一个浏览器提交的数据,通过item.getInputStream可以打开浏览器上传的文件的输入流。

                    // 复制文件
                    FileOutputStream fos = new FileOutputStream(f);
                    byte b[] = new byte[1024 * 1024];
                    int length = 0;
                    while (-1 != (length = is.read(b))) {
                        fos.write(b, 0, length);
                    }
                    fos.close();

                } else {
                    System.out.println(item.getFieldName());
                    String value = item.getString();
                    value = new String(value.getBytes("ISO-8859-1"), "UTF-8");//解码 编码
                    System.out.println(value);
                }
            }

//客户端响应
            String html = "<img width='200' height='150' src='uploaded/%s' />";//根据临时生成的文件名,创建一个html img元素,然后通过response返回浏览器
            response.setContentType("text/html");
            PrintWriter pw= response.getWriter();

            pw.format(html, filename);

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

因为浏览器指定了以二进制的形式提交数据,那么就不能通过常规的手段获取非File字段:

request.getParameter(“heroName”)

在遍历Item时(Item即对应浏览器提交的字段),可以通过

item.isFormField

来判断是否是常规字段还是提交的文件。 当item.isFormField返回true的时候,就表示是常规字段。

然后通过item.getFieldName()和item.getString()就知道分别是哪个字段,以及字段的值了。

以上的上传文件的servlet 基本是作为模板,更多可以了解fileItem类的常用方法——

最后也就是web.xml的配置 很简单在此不赘述

再次经历http500及解决心得——
一般遇到 此类问题 不是servlet那部分的代码写错就是web.xml里的配置出问题
比如 我的servlet的类名是uploadphotoServlet

在写.xml文件时,直接写成:
<servlet-class>uploadphotoServlet </servlet-class>
应该是在uploadphotoServlet前加上包名.
就和写路径一样

这种报的错误都是classNotfound Exception

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值