【问题标题】:I need save some picture,how can I fix that ByteArrayInputStream to FileInputStream?我需要保存一些图片,如何将 ByteArrayInputStream 修复为 FileInputStream?
【发布时间】:2017-10-28 19:23:55
【问题描述】:

请求标头:

Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:61425
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarysqFOqeLTqOafwiDl
Cookie:JSESSIONID=F98C35E6649DC6997616A2CCB70A946A; save=F98C35E6649DC6997616A2CCB70A946A
Host:192.168.0.105:8080
Origin:http://192.168.0.105:8080
Referer:http://192.168.0.105:8080/list
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
X-Requested-With:XMLHttpRequest

这是我的代码:

public boolean muilt(MultipartHttpServletRequest multiReq) throws IOException {
        Map<String, MultipartFile> map = multiReq.getFileMap();
        List<String> list = new ArrayList<>();
        for (String in : map.keySet()) {
            MultipartFile str = map.get(in);
            System.out.println(str.getSize());
            System.out.println(str.getOriginalFilename());
            if (str.getSize() != 0) {
                list.add(in + "," + url + in + ".jpg");
                FileOutputStream fos = new FileOutputStream(new File(url + in + ".jpg"));
                FileInputStream fs = (FileInputStream) str.getInputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fs.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                fs.close();
            }
        }
        if (list.size() < 7){
            return false;
        }
        for (int i = 0; i < 6; ++i){
            String[] sourceStrArray = list.get(i).split(",");
            this.split(sourceStrArray[0], sourceStrArray[1]);
        }
        return true;
    }

错误代码:

FileInputStream fs = (FileInputStream) str.getInputStream();

当它运行时,我遇到了问题:

java.lang.ClassCastException: java.io.ByteArrayInputStream 不能 转换为 java.io.FileInputStream 在 工具.SplitPhoto.muilt(SplitPhoto.java:87) 在 控制器.HanderPhoto.photoHander(HanderPhoto.java:63) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

源是图片,我想把它的流写入文件,怎么办?

【问题讨论】:

  • 移除这个演员表。从任何 InputStream 中读取的方式与从 FileInputStream 中读取的方式相同。
  • 您不需要FileInputStream 来保存数据。你的问题没有意义。

标签: java spring-mvc servlets


【解决方案1】:

MultipartFile 的getInputStream() 方法返回一个InputStream。您不必知道它返回什么样的 InputStream。如您所见,它不是 FileInputStream,这无关紧要。

您需要做的就是从返回的 InputStream 中读取并写入您的文件。无论 InputStream 的具体类型是什么,您都以相同的方式从 InputStream 中读取数据。这就是多态性的全部意义所在。

所以,只需删除无用的演员表,并使用 InputSTream 而不是 FileInputStream。

请注意,您可以在一行代码中使用Files 将 InputStream 的所有内容复制到一个文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2015-07-20
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多