我有一个HTML表单,需要在一个请求中将3个部分上传到现有的REST API.我似乎无法找到有关如何在FormData提交上设置边界的文档.
我试图按照这里给出的示例: 如何在jQuery中使用Ajax请求发送FormData对象?
但是,当我提交数据时,它会被以下堆栈跟踪拒绝:
Caused by: org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found.
Run Code Online (Sandbox Code Playgroud)
我该如何设置边界?
这是HTML/Javascript:
<script type="text/javascript">
function handleSubmit() {
var jsonString = "{" +
"\"userId\":\"" + document.formSubmit.userId.value + "\"" +
",\"locale\":\"" + document.formSubmit.locale.value + "\"" +
"}";
var data = new FormData();
data.append('Json',jsonString);
data.append('frontImage', document.formSubmit.frontImage.files[0]);
data.append('backImage', document.formSubmit.backImage.files[0]);
document.getElementById("sent").innerHTML = jsonString;
document.getElementById("results").innerHTML = "";
$.ajax({
url:getFileSubmitUrl(),
data:data,
cache: false,
processData: false,
contentType: 'multipart/form-data',
type:'POST',
success:function (data, status, req) {
handleResults(req);
},
error:function (req, status, error) …Run Code Online (Sandbox Code Playgroud) 我试图使用'流'Apache Commons File Upload API上传大文件.
我使用Apache Commons File Uploader而不是默认的Spring Multipart上传器的原因是当我们上传非常大的文件大小(~2GB)时它失败了.我在一个GIS应用程序上工作,这种文件上传很常见.
我的文件上传控制器的完整代码如下:
@Controller
public class FileUploadController {
@RequestMapping(value="/upload", method=RequestMethod.POST)
public void upload(HttpServletRequest request) {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
// Inform user about invalid request
return;
}
//String filename = request.getParameter("name");
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
try {
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if …Run Code Online (Sandbox Code Playgroud) 我在eclipse中编译我的项目时遇到了问题.它推迟了错误导入org.apache.commons无法解决.

请有人告诉我这个错误告诉了什么.以及如何解决它.
在上传大文件时,我无法捕捉并优雅地处理commons fileupload FileUploadBase.SizeLimitExceededException或spring MaxUploadSizeExceededException.
据我所知,这些异常在数据绑定期间抛出,在实际到达控制器之前,因此导致500并且不调用异常处理程序方法.有没有人遇到过这个,以及正确处理这些异常的最佳方法是什么?
exception-handling file-upload spring-mvc apache-commons-fileupload
我正在开发一个servlet,它接收包含多个文件内容的多部分请求,我正在使用apache commons文件上传库.
当我调用parseRequest(request);方法servlet抛出异常时:
GRAVE: Servlet.service() for servlet DiffOntology threw exception
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
at org.apache.commons.fileupload.servlet.ServletRequestContext.getContentType(ServletRequestContext.java:73)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:882)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at DiffOntology.doPost(DiffOntology.java:38)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
我把所有库放在WEB-INF/lib中.
编辑:
servlet-api.jar在正确的目录(tomcat/lib)中,所有其他库都在WEB-INF/lib中
我想也许问题可能如下:我在Eclipse中开发这个Web项目,我在类路径中导入了文件上传库.
怎么不行?
我很绝望!!
我想检查上传文件的大小并防止文件完全加载到内存中.我正在使用CommonsMultipartFile.上传的文件将被处理并保存在DB中.AbstractCoupleUploadController类处理包含文件的传入请求:
public abstract class AbstractCoupleUploadController<T extends Serializable> extends RemoteServiceServlet implements ServletContextAware,
UploadServlet<WorkshopHistoryModel>
{
...
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView handleRequest(@RequestParam("firstFile") CommonsMultipartFile firstFile,
@RequestParam("secondFile") CommonsMultipartFile secondFile, HttpServletRequest request, HttpServletResponse response)
{
synchronized(this)
{
initThreads();
perThreadRequest.set(request);
perThreadResponse.set(response);
}
handleUpload(firstFile,secondFile,request,response);
response.getWriter().flush();
response.flushBuffer();
return null;
}
private void handleUpload(CommonsMultipartFile firstFile, CommonsMultipartFile secondFile, HttpServletRequest request,
HttpServletResponse response) throws IOException
{
response.setContentType("text/html");
if(firstFile.getSize() == 0 || secondFile.getSize() == 0)
{
response.getWriter().print(AppConstants.UPLOAD_ZERO_SIZE_FILE);
return;
}
// other validations
// uploading:
try
{
String content = request.getParameter(CoupleUploadPanel.CONTENT);
T model = deserialize(content); …Run Code Online (Sandbox Code Playgroud) java spring file-upload spring-mvc apache-commons-fileupload
当一个文件说从浏览器上传100 MB大小时,Spring将整个数据保存在内存中或临时存储在磁盘中.在通过Spring doc之后,我知道如何设置临时目录,但我想知道如果我不提及会发生什么.
我有以下声明:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
Run Code Online (Sandbox Code Playgroud)
豆 :
public class FileHolder {
private MultipartFile file;
public void setFile(MultipartFile file) {
this.file = file;
}
public MultipartFile getFile() {
return file;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的bean中的"file"对象是否会保存100 MB的数据?
我使用apache-commons-fileupload从获取文件client到server.(使用JSP和Servlet).
JSP/HTML
<form method="POST" action="GetFile" enctype="multipart/form-data">
<input type="file" name="datafile">
<input type="text" name="text1">
<input type="submit" value="Next">
</form>
Run Code Online (Sandbox Code Playgroud)
Servlet:GetFile
System.out.println(request.getParameter("text1"));
Run Code Online (Sandbox Code Playgroud)
我能上传文件到服务器上,但我不能够得到的值text1在servlet(我得到null的值text1的servlet),我需要这样textfield的形式提交一些额外的信息,同时上传到server.
enctype="multipart/form-data"形式的选项不允许其他形式的数据所需提交?如果它不允许它,那么我必须将其他选项发送textfield给它server.这就是我正在做的事情.我想通过Ajax将multipart文件上传到我的Spring网络应用程序.当服务器收到POST请求时,它会在数据库中创建一个票号.然后它启动一个处理实际文件上传的线程.然后服务器返回票号.
我使用CommonsMultipartResolver来处理请求,我已将resolveLazily标志设置为true,以便不立即解决Multipart.
所以这就是我所拥有的东西
@Controller
public class myController{
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public String upload(MultipartHttpServletRequest request, String fileName){
String ticket = dao.createUploadTicket(fileName);
Runnable run = new Runnable(){
@Override
public void run(){
dao.writeUpdate(ticket, "Getting data from request");
final MultipartFile file = request.getFile("theFile");
dao.writeUpdate(ticket, "Multipart file processed");
try {
dao.writeUpdate(ticket, "Saving file to disk");
file.transferTo(new File("/myDirectory"));
dao.writeUpdate(ticket, "File saved to disk");
}
catch(Exception e){
dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString());
}
}
}; …Run Code Online (Sandbox Code Playgroud) java asynchronous file-upload spring-mvc apache-commons-fileupload
我在Java项目中使用Apache commons fileupload 1.4库。我有一个具有经典形式的html部分,带有文件输入和一些隐藏字段。
我仅使用Firefox> = 52上载> 500ko左右的文件时遇到问题
它与Chrome或Internet Explorer中的10mo文件兼容。但是,使用Firefox,在提交表单后等待了几分钟,我超时了。
经过一些调试后,我看到造成超时的代码是:
List<FileItem> items = (new ServletFileUpload(new DiskFileItemFactory())).parseRequest(request);
Run Code Online (Sandbox Code Playgroud)
等待原因的部分是“ parseRequest”。
我尝试使用IntelliJ中的调试器调试请求的内容,但是无法以原始格式复制此请求对象的整个内容值。
在以下情况下可以正常工作:-Firefox:版本<= 52或文件大小<500ko(大约不是很精确)-Internet Explorer-Chrome
没有文件大小限制,这似乎取决于请求的大小,因为解析请求部分要花费太多时间...
在两种情况下,我都收到带有Firefox扩展名的HTTP请求。一个生成的文件上传失败的3mo文件(请求文件很大,是上传文件大小的3倍):https : //code.empreintesduweb.com/13561.html
一个生成的上传文件200ko有效(请求文件很小):https ://code.empreintesduweb.com/13560.html
实际上,主要区别在于在Chrome或IE中,我在请求标头中没有上传文件的原始内容:
具有以下部分的对象:obj stream .... endstream endobj
仅在Firefox中显示...
java ×5
file-upload ×4
servlets ×4
spring-mvc ×4
eclipse ×2
spring ×2
ajax ×1
asynchronous ×1
http ×1
jquery ×1
jsp ×1
request ×1
spring-boot ×1
tomcat ×1
upload ×1