您的位置:首页 > 其它

文件上传下载and图片上传及前台显示

2013-01-23 18:36 429 查看
  之前感觉图片上传下载不就是通过流的形式么,最近做起来还真是棘手啊,所以说有的是就得先做后想才对。

  大体思路:把把图片存到文件夹中,然后把图片的名字存入数据库中。因公司用的Spring框架,所以只用Spring框架完成了上传,之后改变了方法完成的上传及前台显示,还是把网上找的Spring的上传下载贴出来,估计以后用得上,下载没有亲测~~

  Spring上传:

  springmvc.xml必须配置:1.

<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>


2.WEB-INF/lib下必加入:commons-fileupload.jar与commons-io-1.4.jar二个包

3.提交的form表单中属性加: enctype="multipart/form-data"

  单文件上传(以下为三种方法,第二种亲测):

@Controller
public class FileUploadController {

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, BindException errors)
throws Exception {

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
.getFile("file");

String name = multipartRequest.getParameter("name");
System.out.println("name: " + name);
// 获得文件名:
String realFileName = file.getOriginalFilename();
System.out.println("获得文件名:" + realFileName);
// 获取路径
String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "images/";
// 创建文件
File dirPath = new File(ctxPath);
if (!dirPath.exists()) {
dirPath.mkdir();
}
File uploadFile = new File(ctxPath + realFileName);
FileCopyUtils.copy(file.getBytes(), uploadFile);
request.setAttribute("files", loadFiles(request));
return new ModelAndView("success");
}

@RequestMapping(value = "/upload2", method = RequestMethod.POST)
public ModelAndView onSubmit2(HttpServletRequest request,
HttpServletResponse response, BindException errors)
throws Exception {

// 转型为MultipartHttpRequest
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 根据前台的name名称得到上传的文件
MultipartFile file = multipartRequest.getFile("file");
// 获得文件名:
String realFileName = file.getOriginalFilename();
// 获取路径
String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "\\" + "images\\";
// 创建文件
File dirPath = new File(ctxPath);
if (!dirPath.exists()) {
dirPath.mkdir();
}
File uploadFile = new File(ctxPath + realFileName);
FileCopyUtils.copy(file.getBytes(), uploadFile);
request.setAttribute("files", loadFiles(request));
return new ModelAndView("success");
}

@RequestMapping(value = "/upload3", method = RequestMethod.POST)
public String upload(@RequestParam("file")
MultipartFile image, HttpServletRequest request) throws IOException {

String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "\\" + "images\\";
System.out.println("路径:" + ctxPath);
File file = new File(ctxPath + "/" + image.getOriginalFilename());
// FileCopyUtils.copy(image.getBytes(),new
// File(ctxPath+"/"+image.getOriginalFilename()));
try {
image.transferTo(file); // 保存上传的文件
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
request.setAttribute("files", loadFiles(request));
return "success";
}


  多文件上传(没有亲自测试,不过同时参考以下代码写的):

// 多文件上传
@RequestMapping(value = "/upload4", method = RequestMethod.POST)
public ModelAndView fileUpload(HttpServletRequest request,
HttpServletResponse response, BindException errors)
throws Exception {

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "\\" + "images\\";

File file = new File(ctxPath);
if (!file.exists()) {
file.mkdir();
}
String fileName = null;
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
// 上传文件名
// System.out.println("key: " + entity.getKey());
MultipartFile mf = entity.getValue();
fileName = mf.getOriginalFilename();
File uploadFile = new File(ctxPath + fileName);
FileCopyUtils.copy(mf.getBytes(), uploadFile);
}
request.setAttribute("files", loadFiles(request));
return new ModelAndView("success");
}

// @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据
public List<String> loadFiles(HttpServletRequest request) {
List<String> files = new ArrayList<String>();
String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "\\" + "images\\";
File file = new File(ctxPath);
if (file.exists()) {
File[] fs = file.listFiles();
String fname = null;
for (File f : fs) {
fname = f.getName();
if (f.isFile()) {
files.add(fname);
}
}
}
return files;
}


  文件下载:

@RequestMapping("/download/{fileName}")
public ModelAndView download(@PathVariable("fileName")
String fileName, HttpServletRequest request, HttpServletResponse response)
throws Exception {

response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
java.io.BufferedInputStream bis = null;
java.io.BufferedOutputStream bos = null;

String ctxPath = request.getSession().getServletContext().getRealPath(
"/")
+ "\\" + "images\\";
String downLoadPath = ctxPath + fileName;
System.out.println(downLoadPath);
try {
long fileLength = new File(downLoadPath).length();
response.setContentType("application/x-msdownload;");
response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("utf-8"), "ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(downLoadPath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
return null;
}
}


  spring.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"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--
自动搜索@Controller标注的类
用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。
-->
<context:component-scan base-package="net.liuzd.web" />

<!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">
<property name="maxUploadSize">
<value>104857600</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>
</beans>


success.jsp

<%@ taglib  prefix="c" uri="/WEB-INF/c.tld"%>
<h1>Upload Successful</h1>
<c:forEach var="month" items="${files}">
<li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li>
</c:forEach>
<hr><br>
<a href="${pageContext.request.contextPath}/index.jsp">返回</a>


web.xml(必须配置)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>

<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>false</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


================================================================================================================

以上有些没有亲自测试,以下为自己写的图片上传及前台显示

  com.tayh.projectCenter.service.book.impl(BookServiceImpl)

/**上传图片
* @param request  内置对象
* @param response  内置对象
* @param user  用户类
* @param throws Exception  抛出异常
* @return
*
*/
public void upload(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "file1", required = false) MultipartFile file , @ModelAttribute("book") com.tayh.projectCenter.vo.Book book){
//获取上传文件
if("".equals(file)||null==file){
//上传图片为空或null,不进行操作
}else{
//上传图片处理
String file_path=request.getRealPath("/")+"upload";
String file_real_file = "upload" + File.separator + "book" + File.separator;
StringBuffer listFiles = new StringBuffer();
StringBuffer listFileNames = new StringBuffer();
if(!file.isEmpty()){
String fileName = file.getOriginalFilename();
System.out.println(fileName);
File files = new File(file_path, fileName);
if(!files.exists()){
files.mkdirs();
}
if(!fileName.equals(null) && !"".equals(fileName)){
try {
file.transferTo(files);
} catch (Exception e) {
e.printStackTrace();
}
}
listFiles.append(file_real_file + fileName + ",");
listFileNames.append(fileName);
}
String f=listFileNames.toString();
book.setBookPic(f);
}
}

/**将图片读到页面上
* @param request  内置对象
* @param response  内置对象
* @param throws Exception  抛出异常
* @return
*
*/
public void dumpImage(HttpServletRequest request, HttpServletResponse response){
String paramPath = request.getParameter("path");
String path ="";
if(paramPath == null){
path = (String) request.getAttribute("path");
}else{
try {
path = new String(paramPath.getBytes("ISO8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String picPath = request.getRealPath("/")+"upload"+ File.separator+path;
InputStream in = null;
BufferedInputStream bis = null;
OutputStream out = null;
BufferedOutputStream bos = null;

// 判断文件是否存在
File file = new File(picPath);
if (!file.exists() || file.isDirectory()){
return;
}
try {
in = new FileInputStream(picPath);
bis = new BufferedInputStream(in);

byte[] data = new byte[1024];
int bytes = 0;
out = response.getOutputStream();
bos = new BufferedOutputStream(out);
while ((bytes = bis.read(data, 0, data.length)) != -1) {
bos.write(data, 0, bytes);
}
bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bos != null)
bos.close();
if (out != null)
out.close();
if (bis != null)
bis.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


前台页面bookAdd.jsp

<TR height="20px">
<td align="center">图片上传</td>
<td><input type="file" name="file1" id="file1" /></td>
</TR>


前台接收borrowBook.jsp

<td>
<img id="bookImage" src="dumpImage.do?path=${list.bookPic }" style="height:120px;width:100px;" />
</td>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: