当前位置: 首页 > 知识库问答 >
问题:

为什么在Spring中我不能将上传的文件保存在资源/图像文件夹中?

姬温文
2023-03-14

这是一个使用ajax调用的spring项目。我想把上传的图像保存在resources/images文件夹中。以下是我的控制器:

@Controller
//@RequestMapping("/cont")
public class RestController {

      @RequestMapping(value = "/echofile", method = RequestMethod.POST)
        public @ResponseBody HashMap<String, Object> echoFile(MultipartHttpServletRequest request,
                HttpServletResponse response) throws Exception {

              InputStream inputStream = null;
              OutputStream outputStream = null;

            UploadedFile upldfile = new UploadedFile();
            MultipartFile multipartFile = request.getFile("file");

            upldfile.setFile(multipartFile);
            String fileName = multipartFile.getOriginalFilename();



            Long size = multipartFile.getSize();
            String contentType = multipartFile.getContentType();
            InputStream stream = multipartFile.getInputStream();
            byte[] bytes = IOUtils.toByteArray(stream);

            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("fileoriginalsize", size);
            map.put("contenttype", contentType);
            map.put("base64", new String(Base64Utils.encode(bytes)));

            try {
                   inputStream = ((MultipartFile) upldfile).getInputStream();

                   File newFile = new File("E:/Java Project/SimpleAjaxJqueryPicUpload/src/main/resources/images" + fileName);
                   if (!newFile.exists()) {
                    newFile.createNewFile();
                   }
                   outputStream = new FileOutputStream(newFile);
                   int read = 0;
                  // byte[] bytes = new byte[1024];

                   while ((read = inputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, read);
                   }
                  } catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                  }

            return map;
        }

文件被上传并显示在index.jsp中。但它不存储在资源/图像文件夹中。

下面是我的index.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Spring MVC - Upload File</title>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  <script src="http://malsup.github.com/jquery.form.js"></script>

<script type="text/javascript">

var isJpg = function(name) {
    return name.match(/jpg$/i)
};

var isPng = function(name) {
    return name.match(/png$/i)
};

$(document).ready(function() {
    var file = $('[name="file"]');
    var imgContainer = $('#imgContainer');

    var formData = new FormData();
    formData.append('file', jQuery('input[type=file]')[0].files[0]);

    $('#btnUpload').on('click', function() {
        var filename = $.trim(file.val());

        if (!(isJpg(filename) || isPng(filename))) {
            alert('Please browse a JPG/PNG file to upload ...');
            return;
        }

        $.ajax({
            url: "http://localhost:8080/SimpleAjaxJqueryPicUpload/api/echofile",
            type: "POST",
           /*  data: new FormData(document.getElementById("fileForm")), */
            data: formData,
            enctype: 'multipart/form-data',
            processData: false,
            contentType: false
          }).done(function(data) {
              imgContainer.html('');
              var img = '<img src="data:' + data.contenttype + ';base64,'
                  + data.base64 + '"/>';

              imgContainer.append(img);
          }).fail(function(jqXHR, textStatus) {
              //alert(jqXHR.responseText);
              alert('File upload failed ...');
          });

    });

    $('#btnClear').on('click', function() {
        imgContainer.html('');
        file.val('');
    });
});

</script>
</head>

<body>
<body style="font-family: calibri; font-size: 8pt">
<div>
<div id="fileForm">
    <input type="file" name="file" id="image"/>
    <button id="btnUpload" type="button">Upload file</button>
    <button id="btnClear" type="button">Clear</button>
</div>
<div id="imgContainer"></div>
</div>
</body>
</html>

模型是:

package SimpleAjaxJqueryPicUpload.model;

import java.util.List;
import org.springframework.web.multipart.MultipartFile;
public class UploadedFile {

      public int length;
        public byte[] bytes;
        public String name;
        public String type;
        private MultipartFile file;

        public MultipartFile getFile() {
         return file;
        }

        public void setFile(MultipartFile file) {
         this.file = file;
        }


}

它显示了一个错误:

对于路径为[/SimpleAjaxJQueryPicUpload]的上下文中的servlet[dispatcher]的servlet.Service()抛出异常[请求处理失败;嵌套异常为java.lang.ClassCastException:SimpleAjaxJQueryPicUpload.model.UploadedFile不能转换为org.springframework.web.multipart.multipart.File]根原因为java.lang.ClassCastException:SimpleAjaxJQueryPicUpload.multipart.UploadedFile不能转换0(本机方法)位于sun.reflect.nativeMethodAccessorImpl.invoke(未知源)位于sun.reflect.delegatingMethodAccessorImpl.invoke(未知源)位于java.lang.reflect.Method.invoke(未知源)位于org.springframework.web.Method.support.invocableHandlerMethod.doInvoke(未知源)位于rmethod.java:137)在org.springframework.web.servlet.mvc.method.annotation.servletInvocableHandlerMethod.InvokeandHandle(ServletInvocableHandlerMethod.java:110)在org.springframework.web.servlet.mvc.method.mannotation.requestMappingHandlerAdapter.InvokeHandleMethod(requestMappingAdapter.java:776),在.abstractHandlerMethodAdapter.handle(abstractHandlerMethodAdapter.java:85)在org.springframework.web.servlet.dispatcherServlet.doDispatch(dispatcherServlet.java:959)在org.springframework.web.servlet.dispatcherServlet.doService(dispatcherServlet.java:893)在org.springframework.web.servlet.dispatcherServlet.doService(pringframework.web.servlet.frameworkservlet.service(frameworkservlet.java:843),javax.servlet.http.httpservlet.service(httpservlet.java:729),org.apache.catalina.core.applicationFilterChain.internaldoFilter(applicationFilterChain.java:230),org.apache.catalina.core.applicationFilterChain.doFilter(Java:192)在org.apache.catalina.core.applicationFilterChain.doFilter(applicationFilterChain.java:165)在org.apache.catalina.core.standardWrapperValve.invoke(StandardWrapperValve.invoke(StandardWrapperValve.java:199)在org.apache.catalina.core.standardContextValve.invoke(StandardContextValve.invoke(StandardContextValve.java:96)在Invo阀在org.apache.catalina.valves.abstractAccessLogValve.invoke(abstractAccessLogValve.java:624)在org.apache.catalina.core.standardEnginEvalve.invoke(StandardEnginEvalve.java:87)在org.apache.catalina.connector.coyoteAdapter.Service(coyoteAdapter.java:349)在org.apache.coyote.http11.http11Processor.Service(http11Processor.java:783)在handler.process(AbstractProtocol.java:745)在org.apache.tomcat.util.net.nioEndpoint$socketprocessor.dorun(nioEndpoint.java:1437)在org.apache.tomcat.util.net.socketprocessorbase.run(socketprocessorbase.run(socketprocessorbase.java:49)在java.util.concurrent.threadpoolexecutor.runworker(未知源)在)

我的dispatcher-servlet.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

     <context:component-scan base-package="SimpleAjaxJqueryPicUpload.controller" />
     <mvc:annotation-driven />

     <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1048576"/>
    </bean>
</beans>

问题出在哪里?

共有1个答案

梁修贤
2023-03-14

我已经解决了这个问题。我必须改变一些东西。1.我必须在ajax调用中更改。

 url: "http://localhost:8080/SimpleAjaxJqueryPicUpload/api/echofile",
            type: "POST",
            data: formData,
            enctype: 'multipart/form-data',
            processData: false,
            modelAttribute:'uploadedFile',
            contentType: false

我必须添加ModelAttribute:“上传的文件”

那我已经换了控制器。我的控制器是:

@Controller//@RequestMapping(“/cont”)公共类RestController{

  @RequestMapping(value = "/echofile", method = RequestMethod.POST)
    public @ResponseBody HashMap<String, Object> echoFile(MultipartHttpServletRequest request,
            HttpServletResponse response ,  @ModelAttribute("uploadedFile") UploadedFile upldfile) throws Exception {

          InputStream inputStream = null;
          OutputStream outputStream = null;
        MultipartFile multipartFile = request.getFile("file");

        MultipartFile file = upldfile.getFile();
        String fileName = file.getOriginalFilename();

        upldfile.setFile(file);
        String fileName2 = multipartFile.getOriginalFilename();



        Long size = multipartFile.getSize();
        String contentType = multipartFile.getContentType();
        InputStream stream = multipartFile.getInputStream();
        byte[] bytes = IOUtils.toByteArray(stream);

        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("fileoriginalsize", size);
        map.put("contenttype", contentType);
        map.put("base64", new String(Base64Utils.encode(bytes)));

        try {
              // inputStream = ((MultipartFile) upldfile).getInputStream();

            inputStream = file.getInputStream();

               File newFile = new File("E:/Java Project/SimpleAjaxJqueryPicUpload/src/main/resources/images/" + fileName);
               if (!newFile.exists()) {
                newFile.createNewFile();
               }
               outputStream = new FileOutputStream(newFile);
               int read = 0;
              // byte[] bytes = new byte[1024];

               while ((read = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read);
               }
              } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
              }

        return map;
    }

那么问题就解决了!!!!!!!!!!!!:d

 类似资料:
  • 我试图将不同类别的图像保存在一个文件夹中,并检索它们。 watermark.php是 一些图像被保存在上传文件夹和临时文件夹和数据库中,并且水印被应用在它们上...但是现在当我试图上传图像时...它只在上传文件夹中,并且显示一个致命的错误:- 我怎样才能解决这个问题。。并且.PNG图像也没有保存

  • 这里是我的代码,在那里我已经尝试了几个小时,将上传的图像保存在不同大小的服务器文件夹中。但是,图像没有被保存,并且无法得到它出错的地方。以前,我使用二进制代码编写,如下面的第二个代码部分所示,通过从移动端以某种方式带来二进制数据(图片是从相机中获取的,并从移动端即时发送)。但随着数据的增加。我决定使用甚至上传图像文件与多部分类型的文件上传从我的移动端。 但下面的工作与我以前获取二进制数据时的相同函

  • 我正在尝试在netbeans的资源文件夹中保存一个图像文件,但我有问题找到资源文件夹的路径。 我的代码如下:

  • 在Apache Camel上工作时,每当使用camel-zip压缩文件或通过canel-ftp复制文件时,Camel会将文件移动到.Camel文件夹中,并在处理后不将其保留在源文件夹中。我希望我的文件在处理完成后留在源文件夹中。请建议如何实现相同的。 CamelContext context=new DefaultCamelContext();context.addRoutes(new Route

  • 问题内容: 我正在使用Spring Boot和。我正在尝试从文件夹读取一个文件。我尝试了几种不同的方法,但无法正常工作。这是我的代码。 这是文件的位置。 在这里,我可以看到文件夹中的文件。 但是,当我运行代码时,出现以下错误。 我在代码中做错了什么? 问题答案: 在花费大量时间尝试解决此问题之后,终于找到了可行的解决方案。该解决方案利用了Spring的ResourceUtils。也应该适用于jso

  • 更新:通过使用这个链接,我得到了我的应用程序的最佳答案和性能。