首页>>后端>>SpringBoot->java文件上传(java文件上传接口)

java文件上传(java文件上传接口)

时间:2023-12-02 本站 点击:0

java 上传文件 问题

是通过数据流上传吗? 利用 B\S架构还是 C\S架构?

jsp文件上传大多采用采用开源项目来简化处理,这里列出常用的两个jar包的实现,并进行比较,说明他们的优缺点和应该注意的问题。

Commons FileUpload,可以在下载,这个包需要Commons IO的支持,可以在下载

com.oreilly.servlet,可以在下载

Commons FileUpload提供三种文件上传处理方式,DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式,其中DiskFileUpload已经在javadoc下已经被标记为过期的方法,建议用ServletFileUpload代替,而PortletFileUpload需要配合portlet-api来使用,所以这里我们只介绍ServletFileUpload,并且这个也是最常用的。

com.oreilly.servlet也提供了三种文件上传的处理方式,MultipartWrapper、MultipartRequest和MultipartParser三种方式,其中MultipartWrapper和MultipartRequest的用法基本相同,并且没有MultipartRequest提供的操作多,所以这里介绍MultipartRequest,MultipartParser和前两者有些不同,可以用来处理某些特殊情况,例如表单中有两个同名的文件上传选择框。

我们暂时称三面三种文件上传方式分别为:ServletFileUpload方式(MultipartTestServlet)、MultipartRequest方式(MultipartTestServlet2)、MultipartParser方式(MultipartTestServlet3)

代码如下:

test.html

%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%

html

body

form action="MultipartTestServlet" enctype="multipart/form-data" method="post"

input type="text" name="username" /br /

input type="file" name="myfile" /br/

input type="file" name="myfile" /br/

input type="submit" /

/form

br/br/br/br/

form action="MultipartTestServlet2" enctype="multipart/form-data" method="post"

input type="text" name="username" /br /

input type="file" name="myfile" /br/

input type="file" name="myfile" /br/

input type="submit" /

/form

br/br/br/br/

form action="MultipartTestServlet3" enctype="multipart/form-data" method="post"

input type="text" name="username" /br /

input type="file" name="myfile" /br/

input type="file" name="myfile" /br/

input type="submit" /

/form

/body

/html

MultipartTestServlet.java

package com.bug.servlet;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUpload;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.RequestContext;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.fileupload.servlet.ServletRequestContext;

public class MultipartTestServlet extends HttpServlet {

public MultipartTestServlet() {

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("gbk");

RequestContext requestContext = new ServletRequestContext(request);

if(FileUpload.isMultipartContent(requestContext)){

DiskFileItemFactory factory = new DiskFileItemFactory();

factory.setRepository(new File("c:/tmp/"));

ServletFileUpload upload = new ServletFileUpload(factory);

//upload.setHeaderEncoding("gbk");

upload.setSizeMax(2000000);

List items = new ArrayList();

try {

items = upload.parseRequest(request);

} catch (FileUploadException e1) {

System.out.println("文件上传发生错误" + e1.getMessage());

}

Iterator it = items.iterator();

while(it.hasNext()){

FileItem fileItem = (FileItem) it.next();

if(fileItem.isFormField()){

System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));

}else{

System.out.println(fileItem.getFieldName() + " " +

fileItem.getName() + " " +

fileItem.isInMemory() + " " +

fileItem.getContentType() + " " +

fileItem.getSize());

if(fileItem.getName()!=null fileItem.getSize()!=0){

File fullFile = new File(fileItem.getName());

File newFile = new File("c:/temp/" + fullFile.getName());

try {

fileItem.write(newFile);

} catch (Exception e) {

e.printStackTrace();

}

}else{

System.out.println("文件没有选择 或 文件内容为空");

}

}

}

}

}

}

MultipartTestServlet2.java

package com.bug.servlet;

import java.io.IOException;

import java.util.Enumeration;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;

import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class MultipartTestServlet2 extends HttpServlet {

public MultipartTestServlet2() {

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//request.setCharacterEncoding("gbk"); 不起作用

System.out.println("start ");

MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());

System.out.println("start ");

Enumeration filesName = multi.getFileNames();

Enumeration paramsName = multi.getParameterNames();

while(paramsName.hasMoreElements()){

String paramName = (String) paramsName.nextElement();

System.out.println(multi.getParameter(paramName));

}

while(filesName.hasMoreElements()){

String fileName = (String) filesName.nextElement();

System.out.println(multi.getFilesystemName(fileName) + " " +

multi.getOriginalFileName(fileName) + " " +

multi.getContentType(fileName) + " ");

if(multi.getFilesystemName(fileName)!=null !multi.getFilesystemName(fileName).equals(""))

System.out.println(multi.getFile(fileName).toURI());

}

}

}

MultipartTestServlet3.java

package com.bug.servlet;

import java.io.File;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.multipart.FilePart;

import com.oreilly.servlet.multipart.MultipartParser;

import com.oreilly.servlet.multipart.ParamPart;

import com.oreilly.servlet.multipart.Part;

public class MultipartTestServlet3 extends HttpServlet {

public MultipartTestServlet3() {

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");

Part part;

while ((part = mp.readNextPart()) != null) {

String name = part.getName();

if (part.isParam()) {

ParamPart paramPart = (ParamPart) part;

String value = paramPart.getStringValue();

System.out.println("param: name=" + name + "; value=" + value);

}

else if (part.isFile()) {

// it's a file part

FilePart filePart = (FilePart) part;

String fileName = filePart.getFileName();

if (fileName != null) {

long size = filePart.writeTo(new File("c:/tmp/"));

System.out.println("file: name=" + name + "; fileName=" + fileName +

", filePath=" + filePart.getFilePath() +

", contentType=" + filePart.getContentType() +

", size=" + size);

}

else {

System.out.println("file: name=" + name + "; EMPTY");

}

System.out.flush();

}

}

}

}

web.xml中加入

servlet

servlet-nameMultipartTestServlet/servlet-name

servlet-classcom.bug.servlet.MultipartTestServlet/servlet-class

/servlet

servlet

servlet-nameMultipartTestServlet2/servlet-name

servlet-classcom.bug.servlet.MultipartTestServlet2/servlet-class

/servlet

servlet

servlet-nameMultipartTestServlet3/servlet-name

servlet-classcom.bug.servlet.MultipartTestServlet3/servlet-class

/servlet

servlet-mapping

servlet-nameMultipartTestServlet/servlet-name

url-pattern/MultipartTestServlet/url-pattern

/servlet-mapping

servlet-mapping

servlet-nameMultipartTestServlet2/servlet-name

url-pattern/MultipartTestServlet2/url-pattern

/servlet-mapping

servlet-mapping

servlet-nameMultipartTestServlet3/servlet-name

url-pattern/MultipartTestServlet3/url-pattern

/servlet-mapping

问题1、中文问题:

三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题,包括初始化的时候传入gbk作为参数,或是是初始化后通过setEncoding的方式来实现。

另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现,而其它两种方式不支持这种方式。

问题2、文件大小限制

ServletFileUpload方式可以设置文件大小限制,也可以不用设置,例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1),表明不限制上传的大小。文档中没有指明默认的限制的多少,我在不设置的情况下上传了一个9M的东西,可以上传,估计默认是不限制大小的。

而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的,如果不设置,默认是1M的大小限制。

问题3、文件上传发生错误

如果文件上传过程中发生任何错误,或者是文件的大小超出了范围,系统都将抛出错误。

ServletFileUpload方式在upload.parseRequest(request)时抛出错误

MultipartRequest方式在new MultipartRequest(。。。)时抛出错误

MultipartParser方式在new MultipartParser(。。。)时抛出错误

问题4、上传同名文件时,他们保存到临时目录是的冲突问题

ServletFileUpload方式,不会有冲突,系统会把上传得文件按照一定的规则重新命名,保证不会冲突

MultipartParser方式,会产生冲突,系统会把文件按照上传时的文件名,保存到临时目录下,如果两个用会同时上传文件名相同的文件,那么就可能会产生冲突,一方把另一方的临时文件给替换了。

MultipartRequest方式,在初始化时如果提供了一个名称转换策略,就不会有冲突,如果不提桶,就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。

问题5:表单中有两个同名的文件上传选择框,就像我们例子中的myfile一样,每个表单中有两个name=“myfile”的上传框

ServletFileUpload方式,可以处理,可以分别得到他们各自的文件,

MultipartRequest方式,不可以处理,会发生冲突,会有一个上传框的文件覆盖了另外一个。

MultipartParser方式,可以处理,可以分别得到他们各自的文件,

备注:

代码比较乱,主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。

java上传成功后怎么触发其他操作

java get方式异步上传_简述Java异步上传文件的三种方式 原创

2021-02-13 16:31:03

yi bbbian

码龄4年

关注

本文为大家分享了三种Java异步上传文件方式,供大家参考,具体内容如下

用第三方控件,如Flash,ActiveX等浏览器插件上传。

使用隐藏的iframe模拟异步上传。

使用XMLHttpRequest2来实现异步上传。

第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我就不讲了,以免误人子弟,提出这点大家可以自行百度。

第二种使用隐藏的iframe模拟异步上传。为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使当前页面跳转,感觉就像是异步操作一样。

隐藏的iframe上传文件

附件:

正在上传...

// 上传完成后的回调

function uploadFinished(fileName) {

addToFlist(fileName);

loading(false);

}

function addToFlist(fname) {

var temp = ["

",

fname,

"删除",

"

"

];

$("#flist").append(temp.join(""));

}

function loading(showloading) {

if (showloading) {

$("#uptxt").show();

} else {

$("#uptxt").hide;

}

}

这种技术有两个关键的地方:

1.form会指定target,提交的结果定向返回到隐藏的ifram中。(即form的target与iframe的name属性一致)。

2.提交完成后,iframe中页面与主页面通信,通知上传结果及服务端文件信息

如何与主页面通信呢?

我们用nodejs在接收完了文件后返回了一个window.parent.主页面定义的方法,执行后可以得知文件上传完成。代码很简单:

router.post('/upload2', multipartMiddleware, function(req, res) {

var fpath = req.files.myfile.path;

var fname = fpath.substr(fpath.lastIndexOf('\\') + 1);

setTimeout(function {

var ret = ["

"window.parent.uploadFinished('" + fname + "');",

""];

res.send(ret.join(""));

}, 3000);

});

执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。

第三种使用XMLHttpRequest2来进行真正的异步上传。

还是先贴出代码:

执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。第三种使用XMLHttpRequest2来进行真正的异步上传。还是先贴出代码:

xhr level2 异步上传

附件:

正在上传...

停止上传

function upload {

// 1.准备FormData

var fd = new FormData;

fd.append("myfile", $("#myfile")[0].files[0]);

// 创建xhr对象

var xhr = new XMLHttpRequest;

// 监听状态,实时响应

// xhr 和 xhr.upload 都有progress事件,xhr.progress是下载进度,xhr.upload.progress是上传进度

xhr.upload.onprogress = function(event) {

if (event.lengthComputable) {

var percent = Math.round(event.loaded * 100 / event.total);

console.log('%d%', percent);

$("#upprog").text(percent);

}

};

// 传输开始事件

xhr.onloadstart = function(event) {

console.log('load start');

$("#upprog").text('开始上传');

$("#stopbtn").one('click', function { xhr.abort; $(this).hide();});

loading(true);

};

// ajax过程成功完成事件

xhr.onload = function(event) {

console.log('load success');

$("#upprog").text('上传成功');

console.log(xhr.responseText);

var ret = JSON.parse(xhr.responseText);

addToFlist(ret.fname);

};

// ajax过程发生错误事件

xhr.onerror = function(event) {

console.log('error');

$("#upprog").text('发生错误');

};

// ajax被取消

xhr.onabort = function(event) {

console.log('abort');

$("#upprog").text('操作被取消');

};

// loadend传输结束,不管成功失败都会被触发

xhr.onloadend = function (event) {

console.log('load end');

loading(false);

};

// 发起ajax请求传送数据

xhr.open('POST', '/upload3', true);

xhr.send(fd);

}

function addToFlist(fname) {

var temp = ["

",

fname,

"删除",

"

"

];

$("#flist").append(temp.join(""));

}

function delFile(fname) {

console.log('to delete file: ' + fname);

// TODO: 请实现

}

function loading(showloading) {

if (showloading) {

$("#uptxt").show();

$("#stopbtn").show();

} else {

$("#uptxt").hide();

$("#stopbtn").hide();

}

}

代码有点多,但是通俗易懂。使用过AJAX的人都知道,XHR对象提供了一个onreadystatechange的回调方法来监听整个请求/响应过程。在XMLHttpRequest2级规范中又多了几个进度事件。有以下6个事件:

1.loadstart:在接收到响应数据的第一个字节时触发。

2.progress:在接收响应期间持续不断地触发。

3.error:在请求发生错误时触发。

4.abort:在因为调用abort方法而终止连接时触发。

5.load:在接收到完整的响应数据时触发。

6.loadend: 在通信完成或者触发error,abort,load事件后触发。

这次我们可以解读代码:当传输事件开始后,我们便在停止传送按钮上添加点击事件,内置了abort方法可以停止传送。若不点则会正常上传直到传送完毕为止。其后台代码类似第二种方法。

三种方法各有优劣,做个简单的小结吧。

第三方控件交互性和可控性好,因为接近底层,其性能也是很优秀的。但是由于编写难度大通常需要自己安装插件,有时可能需要自己进行编写。

隐藏的iframe方法我个人觉得是非常有思想的一个方法,iframe可以帮我们做很多事。这种方式具有广泛的浏览器兼容性而且不需要安装插件。但是它交互性差,上传过程不可控,而且性能也是很一般的。

XHR2级的纯ajax上传,它必须要版本比较高一点的浏览器(ie9+)。但是它交互性特别好,可以看到上传进度并且是可控的。

java.lang.exception文件上传失败

java.lang.exception文件上传失败解决方法:将文件的编码方式改为utf-8即可。根据查询相关资料信息,这个错误是在使用wangEditor配置多文件上传的时候出现的,使用单个文件上传没有这个问题。直接使用多文件上传一直报错,就用了单文件循环。

java后台文件上传到资源服务器上

package com.letv.dir.cloud.util;import com.letv.dir.cloud.controller.DirectorWatermarkController;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * Created by xijunge on 2016/11/24 0024. */public class HttpRequesterFile { private static final Logger log = LoggerFactory.getLogger(HttpRequesterFile.class); private static final String TAG = "uploadFile"; private static final int TIME_OUT = 100 * 1000; // 超时时间 private static final String CHARSET = "utf-8"; // 设置编码 /** * 上传文件到服务器 * * @param file * 需要上传的文件 * @param RequestURL * 文件服务器的rul * @return 返回响应的内容 * */ public static String uploadFile(File file, String RequestURL) throws IOException {

String result = null;

String BOUNDARY = "letv"; // 边界标识 随机生成 String PREFIX = "--", LINE_END = "\r\n";

String CONTENT_TYPE = "multipart/form-data"; // 内容类型 try {

URL url = new URL(RequestURL);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setReadTimeout(TIME_OUT);

conn.setConnectTimeout(TIME_OUT);

conn.setDoInput(true); // 允许输入流 conn.setDoOutput(true); // 允许输出流 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); // 请求方式 conn.setRequestProperty("Charset", CHARSET); // 设置编码 conn.setRequestProperty("connection", "keep-alive");

conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);

java 实现文件上传到另一台服务器,该怎么解决

上传本地文件代码

使用步骤如下:

1.调用AddFile函数添加本地文件,注意路径需要使用双斜框(\\)

2.调用PostFirst函数开始上传文件。

JavaScript code?script type="text/javascript" language="javascript" var fileMgr = new HttpUploaderMgr(); fileMgr.Load();//加载控件 window.onload = function() { fileMgr.Init();//初始化控件 //添加一个本地文件 fileMgr.AddFile("D:\\Soft\\QQ2010.exe"); fileMgr.PostFirst(); };/script


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/9885.html