我用的Spring MVC与Java的配置,我已经定义了一些其他的服务。我用Spring作为服务器后端和AngularJS为WebFrontend。
我想从我的AngularJS站点中的一个或两个的CSV文件到我的休息服务上传。如何我必须配置Spring的Java配置,这样它的作品?我用Tomcat和一个Servlet容器3
我上传REST服务是这样的:
@Controller@RequestMapping(上传)@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10 // 10 MBMAXFILESIZE = 1024 * 1024 * 50,// 50 MBmaxRequestSize = 1024 * 1024 * 100)// 100 MB公共类UploadController { @RequestMapping(值=/上传,方法= RequestMethod.GET) 公共字符串@ResponseBody provideUploadInfo(){ 返回你可以通过发布此相同的URL上传的文件。 } @RequestMapping(值=/上传,方法= RequestMethod.POST) 公共字符串@ResponseBody handleFileUpload(@RequestParam(name)的字符串名称, @RequestParam(文件)MultipartFile文件){ 如果(!file.isEmpty()){ 尝试{ 字节[]字节= file.getBytes(); 的BufferedOutputStream流= 新的BufferedOutputStream(新的FileOutputStream(新文件(名称+-uploaded))); stream.write(字节); stream.close(); 返回您已成功上传+姓名+到+姓名+-uploaded!; }赶上(例外五){ 返回你上传失败+姓名+=>中+ e.getMessage(); } }其他{ 返回你上传失败+姓名+,因为该文件是空的。 } }}
我需要一个StandardServletMultipartResolver?或其他任何让上传工作?如果是这样,我怎么能实现用java配置多部分上传?我此刻的配置是这样的:
公共类WebInitializer扩展AbstractAnnotationConfigDispatcherServletInitializer { @覆盖 保护类<> [] getRootConfigClasses(){ 返回新的Class<> [] {PersistenceContext.class,AppConfig.class,SecurityConfig.class}; } @覆盖 保护类<> [] getServletConfigClasses(){ 返回新的Class<> [] {} WebConfig.class; } @覆盖 受保护的String [] getServletMappings(){ 返回新的String [] {/春/ *}; } @覆盖 保护过滤器[] getServletFilters(){ CharacterEncodingFilter characterEncodingFilter =新CharacterEncodingFilter(); characterEncodingFilter.setEncoding(UTF-8); CorsFilter CF =新CorsFilter(); MultipartFilter MPF =新MultipartFilter(); // MultipartFilter支持 返回新的过滤[] {characterEncodingFilter,CF,强积金}; }}
和WebConfig:
@Configuration @EnableWebMvc @ComponentScan(basePackages = {控制器}) 公共类WebConfig扩展WebMvcConfigurerAdapter { @豆公共MultipartResolver multipartResolver(){ 返回新StandardServletMultipartResolver(); }
![谷歌浏览器找javascript 设置](/d/file/2023/09-17/ba74a2ddf443b48ad11bbb9bf3cb3dee.png)
}
和ApplicationConfig
@Configuration公共类的AppConfig { @豆 公开测试getTest(){ 返回新的测试(); }}
与上传的示例是从本网站 http://spring.io/guides/gs/uploading-files / 但他们用MultiPartConfigFactory,这是从春天开机;我可以用这个来?我没有在目前使用的春天开机。那么什么是让多部分上传我的配置工作的最简单的方法!?
EDIT2:我已经添加了两件事情对我的配置上面新getServletFilter看起来现在这个样子,我添加了一个MultipartFilter():
@覆盖 保护过滤器[] getServletFilters(){ CharacterEncodingFilter characterEncodingFilter =新CharacterEncodingFilter(); characterEncodingFilter.setEncoding(UTF-8); CorsFilter CF =新CorsFilter(); MultipartFilter MPF =新MultipartFilter(); // MultipartFilter支持 返回新的过滤[] {characterEncodingFilter,CF,强积金}; }
和在我的WebConfig我添加了一个StandardServletMultipartResolver:
@Bean公共MultipartResolver multipartResolver(){ 返回新StandardServletMultipartResolver(); }
现在我想用一个简单的HTML这样的网站来测试它:
< DOCTYPE HTML PUBLIC - // W3C // DTD HTML 4.01过渡// ENhttp://www.w3.org/TR/html4/loose! DTD>< HTML和GT;< HEAD>< META HTTP-EQUIV =Content-Type的CONTENT =text / html的;字符集= ISO-8859-1><标题>此处插入标题< /标题>< /头><身体GT;<形式方法=POSTENCTYPE =的multipart / form-data的 行动=HTTP://本地主机:8081 /项目/春/上传/上传> 文件上传:LT;输入类型=文件名称=文件>< BR />名称:或其可输入 TYPE =文本名称=名字>< BR /> < BR /> <输入类型=提交 值=上传>这里preSS要上传的文件! < /表及GT;< /身体GT;< / HTML>
但它说HTTP状态400 - 必需的字符串参数'名'是不是present。为什么不名称present!?
解决方案我有同样的问题,事实证明,这是由于StandardServletMultipartResolver。它改成org.springframework.web.multipart.commons.CommonsMultipartResolver见从那里我得到了这个解决方案
这可能不会涉及到在这个岗位psented问题$ P $,但可能会有所帮助。具有调试打开,我可以看到在记录此调试消息: - 请求已经是MultipartHttpServletRequest - 如果不是在前进,这通常是从一个额外的MultipartFilter导致的web.xml
得到通过删除 MultipartFilter
在 getServletFilters摆脱这种从过滤器的阵列()
。 MultipartFilter MPF =新MultipartFilter();
I have used spring MVC with java config and I have defined some rest-services. I used Spring as server backend and AngularJS as WebFrontend.
I want upload from my AngularJS site one or two CSV files to my rest service. How must i configure spring with java config so that it works? I used Tomcat and a Servlet 3 Container.
My upload rest service looks like this:
@Controller
@RequestMapping("Upload")
@MultipartConfig(fileSizeThreshold=1024*1024*10, // 10 MB
maxFileSize=1024*1024*50, // 50 MB
maxRequestSize=1024*1024*100) // 100 MB
public class UploadController {
@RequestMapping(value="/upload", method=RequestMethod.GET)
public @ResponseBody String provideUploadInfo() {
return "You can upload a file by posting to this same URL.";
}
@RequestMapping(value="/upload", method=RequestMethod.POST)
public @ResponseBody String handleFileUpload(@RequestParam("name") String name,
@RequestParam("file") MultipartFile file){
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
stream.write(bytes);
stream.close();
return "You successfully uploaded " + name + " into " + name + "-uploaded !";
} catch (Exception e) {
return "You failed to upload " + name + " => " + e.getMessage();
}
} else {
return "You failed to upload " + name + " because the file was empty.";
}
}
}
Do i need a "StandardServletMultipartResolver" ? or anything else to get the upload to work ? and if so, how can i enable the multi-part upload with java config ? my config at the moment looks like this:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{ PersistenceContext.class,AppConfig.class,SecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/Spring/*" };
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
CorsFilter cf=new CorsFilter();
MultipartFilter mpf=new MultipartFilter(); //MultipartFilter support
return new Filter[] {characterEncodingFilter,cf,mpf};
}
}
and WebConfig:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "controller" })
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public MultipartResolver multipartResolver(){
return new StandardServletMultipartResolver();
}
}
and ApplicationConfig
@Configuration
public class AppConfig {
@Bean
public Test getTest(){
return new Test();
}
}
The Example with the upload is from this site http://spring.io/guides/gs/uploading-files/ but they used a MultiPartConfigFactory and this is from spring boot; can i use this to ? i did not use spring boot at the moment.. So What is the easiest way to get the multi-part upload working with my configuration!?
EDIT2: I have added two things to my configuration Above the new getServletFilter looks now like this, i have added a MultipartFilter():
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
CorsFilter cf=new CorsFilter();
MultipartFilter mpf=new MultipartFilter(); //MultipartFilter support
return new Filter[] {characterEncodingFilter,cf,mpf};
}
and in my WebConfig i have added a StandardServletMultipartResolver:
@Bean
public MultipartResolver multipartResolver(){
return new StandardServletMultipartResolver();
}
Now i want to test it with a simple html site like this:
<!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>Insert title here</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data"
action="http://localhost:8081/project/Spring/Upload/upload">
File to upload: <input type="file" name="file"><br /> Name: <input
type="text" name="name"><br /> <br /> <input type="submit"
value="Upload"> Press here to upload the file!
</form>
</body>
</html>
but it says "HTTP Status 400 - Required String parameter 'name' is not present". why is name not present !?
解决方案I had the same issue, and it turned out that it was due to the StandardServletMultipartResolver. Changed it to org.springframework.web.multipart.commons.CommonsMultipartResolver See stackoverflow post from where I got this solution
This may not be related to the problem presented in this post, but may help. With DEBUG turned on, I could see this DEBUG message in the logs:- "Request is already a MultipartHttpServletRequest - if not in a forward, this typically results from an additional MultipartFilter in web.xml"
Got rid of this by removing the MultipartFilter
from the array of filters in getServletFilters()
.
MultipartFilter mpf=new MultipartFilter();
相关推荐
最新文章