文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容相关的知识,希望对你有一定的参考价值。

最近在手机上传文件时,由于手机的插件使用的是原生的流形式进行的上传,导致使用Spring的上传组件不能使用,所以就根据HTTP协议的格式,自己开发了一个读取文件流的上传文件方法,其中发现,手机端采用android和苹果时,头信息不一样,找了好久最终采用http协议上传时,空行作为标准进行文件内容和头的分割,即适配不同终端的上传;另外,再上传文件时,如果采用字符流,读出来的图片文件都是坏的即打不开的,所以都是采用字节流进行图片文件的上传。如下是代码(仅供参考):

@Note(note = "bigAnt:servlet上传文件", author = "zhangwenbo")
    @RequestMapping({ "modifyPictureByStream2" })
    @ResponseBody
    public SimpleMessage<Object> modifyPictureByStream2(HttpServletRequest req, HttpServletResponse response) {
        this.logger.info("modifyHeaderPicture has invoked.filename is ");

        SimpleMessage<Object> sm = new SimpleMessage<Object>();

        InputStream in = null;

        RandomAccessFile accessFile = null;

        ByteArrayOutputStream outputStream = null;

        FileOutputStream fileout = null;

        File tmpFile = null, fileIO = null;

        try {
            // 获取文件上传时的标记
            String boundaryText = req.getContentType().substring(req.getContentType().indexOf("boundary=") + 9);

            // 先以文本格式缓存文件
            in = req.getInputStream();

            tmpFile = File.createTempFile(UUID.randomUUID().toString(), ".txt");

            if (tmpFile.exists()) {
                tmpFile.createNewFile();
            }

            logger.info("cache file path is :" + tmpFile.getPath());

            fileout = new FileOutputStream(tmpFile);

            byte[] tmp_byte = new byte[1024];

            int tmp = -1;

            while ((tmp = in.read(tmp_byte)) > -1) {
                fileout.write(tmp_byte, 0, tmp);
            }

            fileout.flush();

            fileout.close();

            // 从文件内容中分析数据内容
            accessFile = new RandomAccessFile(tmpFile, "r");

            outputStream = new ByteArrayOutputStream();

            String line = accessFile.readLine();

            boolean contentBegin = false;

            boolean hasfileName = false;

            String filename = "";

            while (true) {
                if (!hasfileName) {
                    int filename_index = line.indexOf("filename=\"");

                    if (filename_index > -1) {
                        contentBegin = true;

                        filename = line.substring(filename_index + 10, line.length() - 1);

                        System.out.println("filename is " + filename);

                        while (!"".equals(line.trim())) {// 此处就是一空行为标记,如果以其他的为标记,可能会因为头内容不一样导致,读取失败
                            line = accessFile.readLine();
                        }
                        hasfileName = true;

                        logger.info("the upload filename is :" + filename);

                        continue;
                    }
                    line = accessFile.readLine();
                }

                if (contentBegin) {
                    byte[] temp_byte = new byte[1024];

                    int byte_len = -1;

                    while ((byte_len = accessFile.read(temp_byte)) > -1) {

                        String con_temp = new String(temp_byte, 0, byte_len);

                        if (con_temp.indexOf(boundaryText) > -1) {
                            break;
                        }
                        outputStream.write(temp_byte, 0, byte_len);
                    }
                    break;
                }
            }

            // 恢复上传文件的类型
            int filename_index = filename.indexOf(".");

            fileIO = File.createTempFile(filename.substring(0, filename_index), filename.substring(filename_index));

            if (!(fileIO.exists())) {
                fileIO.createNewFile();
            }

            logger.info("target file filepath:" + fileIO.getPath());

            fileout = new FileOutputStream(fileIO);

            byte[] tem_byte = outputStream.toByteArray();

            System.out.println("write file length is :" + tem_byte.length);

            fileout.write(tem_byte);

            fileout.flush();

            // 开始上传文件到目标服务器
            Map<String, Object> postBody = new HashMap<String, Object>();

            postBody.put("loginname", req.getSession().getAttribute("sessionUserId"));

            BigAntBaseRes uploadResult = BigAntClient.getInstance().uploadPicture(postBody, filename, fileIO);

            this.logger.info("upload return msg is " + uploadResult);

            if (null != uploadResult) {
                if ("1".equals(uploadResult.getStatus().trim()))
                    sm.set("data", uploadResult.getData());
                else
                    sm.set("message", uploadResult.getMsg());
            } else {
                sm.set("message", "upload fail");
            }

        } catch (IOException e) {
            logger.info("upload the file fail.", e);

            sm.set("message", "upload fail");
        } finally {
            try {
                // 删除临时文件
                if (tmpFile.exists()) {
                    tmpFile.delete();
                }

                if (fileIO.exists()) {
                    fileIO.delete();
                }

                if (null != in) {
                    in.close();
                }

                if (null != fileout) {
                    fileout.close();
                }

                if (null != accessFile) {
                    accessFile.close();
                }

                if (null != outputStream) {
                    outputStream.close();
                }
            } catch (Exception e2) {
                logger.info("release resource fail.", e2);
            }
        }
        return sm;
    }


本文出自 “java” 博客,请务必保留此出处http://zwbjava.blog.51cto.com/2789897/1789880

以上是关于文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容的主要内容,如果未能解决你的问题,请参考以下文章

文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容

文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容

servlet

Servlet

1.初学 servlet

Java中的文件上传(原始Servlet实现)