μ΄μ μ΄ν΄λ¦½μ€μμ Model1 λ°©μμΌλ‘ λ§λ€μλ νμΌ μ λ‘λ ꡬνμ μ€νλ§μμ λ€μ ν΄λ³΄μλ€.
μ΄μ λ³΄λ€ κ°νΈν΄μ§ μ μ 컨νΈλ‘€λ¬μμ MultipartFile μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ§€κ°λ³μλ‘ file formμ μ½κ² λ°λ‘ λ°μ μ μλ€λ κ².
κΈ°λ³Έ μΈν
1. λ©μ΄λΈ λ νμ§ν 리μμ fileupload κ²μ
2. Apache Commons FileUploadμ maven νκ·Έ κ°μ Έμμ pom.xmlμ μμ± (μλ νκ·Έ)
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
3. /spring ν΄λμ file-context.xml μμ±
file-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- upload -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/> <!-- ν μμ²λΉ νμ©λλ μ΅λμ¬μ΄μ¦ 100mb -->
<property name="maxInMemorySize" value="102400"/>
<property name="defaultEncoding" value="UTF-8" />
<property name="uploadTempDir" value="upload" />
</bean>
<!-- download -->
<bean id="downloadView" class="util.DownloadView"/>
<bean id="downloadViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order">
<value>0</value>
</property>
</bean>
</beans>
5. web.xmlμ xml κ²½λ‘ μΆκ°
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/servlet-context.xml
/WEB-INF/spring/aop-context.xml
/WEB-INF/spring/file-context.xml <!--μ¬κΈ° μΆκ°λ¨ -->
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
6. ν μ΄λΈ μμ±
DROP TABLE PDS
CASCADE CONSTRAINTS;
DROP SEQUENCE SEQ_PDS;
-----------------------
CREATE TABLE PDS(
SEQ NUMBER(8) PRIMARY KEY,
ID VARCHAR2(50) NOT NULL,
TITLE VARCHAR2(200) NOT NULL,
CONTENT VARCHAR2(4000) NOT NULL,
FILENAME VARCHAR2(50) NOT NULL,
NEWFILENAME VARCHAR2(50) NOT NULL,
READCOUNT NUMBER(8) NOT NULL,
DOWNCOUNT NUMBER(8) NOT NULL,
REGDATE DATE NOT NULL
);
CREATE SEQUENCE SEQ_PDS
START WITH 1
INCREMENT BY 1;
ALTER TABLE PDS
ADD CONSTRAINT FK_PDS_ID FOREIGN KEY(ID)
REFERENCES MEMBER(ID);
PdsController.java
package bit.com.a.controller;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import bit.com.a.dto.BbsDto;
import bit.com.a.dto.PdsDto;
import bit.com.a.service.PdsService;
import util.PdsUtil;
@Controller
public class PdsController {
@Autowired
PdsService service;
@RequestMapping(value = "pdslist.do", method = {RequestMethod.GET, RequestMethod.POST})
public String pdslist(Model model) {
model.addAttribute("doc_title", "μλ£μ€ λͺ©λ‘");
List<PdsDto> list = service.getPdsList();
model.addAttribute("pdslist", list);
return "pdslist.tiles";
}
@RequestMapping(value = "pdsWrite.do", method = {RequestMethod.GET, RequestMethod.POST})
public String pdsWrite(Model model) {
model.addAttribute("doc_title", "μλ£ μ¬λ¦¬κΈ°");
return "pdsWrite.tiles";
}
//μ
λ‘λ
@RequestMapping(value = "pdsUpload.do", method = {RequestMethod.GET, RequestMethod.POST})
public String pdsUpload(PdsDto pdsdto, @RequestParam(value="fileload", required = false) MultipartFile fileload,
HttpServletRequest req) {
PdsUtil.fileUpload(pdsdto, fileload, req);
//DBμ μ₯
service.uploadPds(pdsdto);
return "redirect:/pdslist.do";
}
@RequestMapping(value = "fileDownload.do", method = {RequestMethod.GET, RequestMethod.POST})
public String fileDownload(String newFilename, int seq, HttpServletRequest req, Model model) {
/* download κ²½λ‘ μ€μ */
// 1. server
String fupload = req.getServletContext().getRealPath("/upload");
// 2. folder
// String fupload = "d:\\tmp";
File downloadFile = new File(fupload + "/" + newFilename);
model.addAttribute("downloadFile", downloadFile);
model.addAttribute("seq", seq);
return "downloadView";
}
@RequestMapping(value = "pdsDetail.do", method = { RequestMethod.GET, RequestMethod.POST })
public String pdsDetail(Model model, Integer seq, HttpServletRequest req) {
if(seq == null) seq = -1;
service.readCount(seq);
PdsDto dto = service.getDetail(seq);
model.addAttribute("pds", dto);
model.addAttribute("doc_title", "κΈ μμΈνμ΄μ§");
return "pdsDetail.tiles";
}
@RequestMapping(value = "pdsDelete.do", method = { RequestMethod.GET, RequestMethod.POST })
public String pdsDelete(Model model, Integer seq) {
if(seq == null) seq = -1;
boolean b = service.deletePds(seq);
if(b) {
System.out.println("μμ μ±κ³΅");
} else {
System.out.println("μμ μ€ν¨");
}
return "redirect:/pdslist.do";
}
@RequestMapping(value = "pdsUpdate.do", method = { RequestMethod.GET, RequestMethod.POST })
public String pdsUpdate(Model model, Integer seq) {
if(seq == null) seq = -1;
PdsDto dto = service.getDetail(seq);
model.addAttribute("pds", dto);
model.addAttribute("doc_title", "κΈμμ ");
return "pdsUpdate.tiles";
}
@RequestMapping(value = "pdsUpdateAf.do", method = {RequestMethod.GET, RequestMethod.POST})
public String pdsUpdateAf(PdsDto pdsdto, @RequestParam(value="fileload", required = false) MultipartFile fileload,
HttpServletRequest req) {
System.out.println("νμΌλ€μ΄μλμ§ μλ€μ΄μλμ§. λ€μ΄μ€λ©΄ true: "+!fileload.isEmpty());
if(!fileload.isEmpty()) {
PdsUtil.fileUpload(pdsdto, fileload, req);
}
System.out.println("μμ μ¬ν :" +pdsdto.toString());
boolean b = service.updatePds(pdsdto);
if(b) {
System.out.println("μμ μ±κ³΅");
} else {
System.out.println("μμ μ€ν¨");
}
return "redirect:/pdslist.do";
}
}
PdsUtil.java
μ λ‘λ κ΄λ ¨ ν΄λμ€.
μλ² λλ λλ ν 리μ μ μ₯λ νμΌμ μ΄λ¦ μ€λ³΅ μ κ±°λ₯Ό μν΄ νμ¬ μκ°μΌλ‘ νμΌ μ΄λ¦μ λ°κΎΈλ μμ μ νλ€.
MultipartFile μΈν°νμ΄μ€λ₯Ό ν΅ν΄ νμΌ μ λ‘λ ꡬν.
μλλ νμΌ μ΄λ¦μμ '.'μ μμΉλ₯Ό μμμλΆν° ꡬνμ§λ§ νμΌμ체 μ΄λ¦μ '.'μ΄ ν¬ν¨λ μ μμΌλ―λ‘,
lastIndexOf('.')λ₯Ό ν΅νμ¬ κ΅¬ννλκ² λ°λμ§νλ€.
package util;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import bit.com.a.dto.PdsDto;
public class PdsUtil {
/* νμΌλͺ
λ³κ²½(time) */
// ex) myfile.txt --> 2646718454.txt
// myfile.txt -> indexOf('.') -> 6
// '.'μ μμΉλ₯Ό ꡬνμ¬ νμΌλͺ
, νμ₯μλͺ
λλλ€.
// substring(0, 6) -> νμΌλͺ
. 0λΆν° 6 μ κΉμ§
// substring(6) -> νμ₯μλͺ
(.txt). 6λΆν° λκΉμ§
public static String getNewFileName(String f) {
String filename = "";
String fpost = "";
if(f.indexOf('.') >= 0) { // λνΈκ° μμ λ(νμ₯μλͺ
μ΄ μμλ),
fpost = f.substring(f.indexOf('.')); //νμ₯μλͺ
(.txt)
filename = new Date().getTime() + fpost;
}
else {
filename = new Date().getTime()+ ".back"; //μμμ νμ₯μλͺ
μ λΆμ¬λ
}
return filename;
}
public static PdsDto fileUpload(PdsDto pdsdto, MultipartFile fileload, HttpServletRequest req) {
/* filename μ·¨λ */
String filename = fileload.getOriginalFilename();
pdsdto.setFilename(filename); //μλ³Έ νμΌλͺ
/* upload κ²½λ‘ μ€μ */
// 1. server(tomcat)
String fupload = req.getServletContext().getRealPath("/upload");
// 2. folder(λλ ν 리)
// String fupload = "d:\\tmp";
System.out.println("κ²½λ‘ : "+fupload);
/* νμΌλͺ
λ³κ²½ */
String newFilename = PdsUtil.getNewFileName(pdsdto.getFilename());
pdsdto.setNewFilename(newFilename);
File file = new File(fupload + "/" + newFilename); // c:~~/~~/43253244214.jpg
//import org.apache.commons.io.FileUtils;
try {
//μ€μ μ
λ‘λ λλ λΆλΆ
FileUtils.writeByteArrayToFile(file, fileload.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return pdsdto;
}
}
pdslist.jsp
λ©μΈ 리μ€νΈ νμ΄μ§.
β» λ€μ΄λ‘λ λ²νΌ ꡬν μ POSTλ‘ λ³΄λ΄μΌ ν λ
hidden inputμ κ°μ§κ³ μλ formμ λ§λ€μ΄ μλ°μ€ν¬λ¦½νΈ ν¨μλ₯Ό ν΅ν΄ submitνλ€.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table class="list_table" style="width:85%">
<colgroup>
<col width="50">
<col width="100">
<col width="300">
<col width="50">
<col width="50">
<col width="50">
<col width="100">
<col width="50">
</colgroup>
<thead>
<tr>
<th>λ²νΈ</th>
<th>μμ±μ</th>
<th>μ λͺ©</th>
<th>λ€μ΄λ‘λ</th>
<th>μ‘°νμ</th>
<th>λ€μ΄λ‘λμ</th>
<th>μμ±μΌ</th>
<th>μμ </th>
</tr>
</thead>
<tbody>
<c:forEach var="pds" items="${pdslist }" varStatus="i">
<tr>
<th>${i.count }</th>
<td>${pds.id }</td>
<td style="text-align: left;"><a href="pdsDetail.do?seq=${pds.seq}">${pds.title }</a></td>
<td><input type="button" name="btnDown" value="λ€μ΄λ‘λ" onclick="fileDown('${pds.newFilename}','${pds.seq }')"></td>
<td>${pds.readcount }</td>
<td>${pds.downcount }</td>
<td><font size="1">${pds.regdate }</font></td>
<td><img alt="" src="image/del.png" data_file_seq="${pds.seq }" class="btn_fileDelete" onclick="deletePage(${pds.seq })"></td>
</tr>
</c:forEach>
</tbody>
</table>
<div id="button.wrap">
<span class="button blue">
<button type="button" id="_btnAdd">μλ£μΆκ°</button>
</span>
</div>
<!-- λ€μ΄λ‘λ λ²νΌ ν΄λ¦ -->
<form name="file_Down" action="fileDownload.do" method="post">
<input type="hidden" name="newFilename">
<input type="hidden" name="seq">
</form>
<script>
$('#_btnAdd').click(function() {
location.href = "pdsWrite.do";
});
/* hidden formμ λ§λ€μ΄ POST λ°©μμΌλ‘ μ λ¬ν μ μλ€. (JSλ κΈ°λ³Έμ μΌλ‘ GETλ°©μλ§ κ°λ₯νκΈ° λλ¬Έ)*/
function fileDown(newFilename, seq) {
let doc = document.file_Down;
doc.newFilename.value = newFilename;
doc.seq.value = seq;
doc.submit();
}
function deletePage(seq) {
if (confirm("μ λ§ μμ νμκ² μ΅λκΉ?") == true){ //νμΈ
location.href="pdsDelete.do?seq="+seq;
}else{ //μ·¨μ
return false;
}
}
</script>
pds.xml
DB μ κ·Ό Mybatis mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Pds">
<select id="getPdsList" resultType="bit.com.a.dto.PdsDto">
SELECT SEQ, ID, TITLE, CONTENT, FILENAME, NEWFILENAME, READCOUNT, DOWNCOUNT, REGDATE
FROM PDS
ORDER BY SEQ DESC
</select>
<insert id="uploadPds" parameterType="bit.com.a.dto.PdsDto">
INSERT INTO PDS(SEQ, ID, TITLE, CONTENT, FILENAME, NEWFILENAME, READCOUNT, DOWNCOUNT, REGDATE)
VALUES (SEQ_PDS.NEXTVAL, #{id}, #{title}, #{content}, #{filename}, #{newFilename}, 0, 0, SYSDATE)
</insert>
<!-- μ€λ¦¬μ§λ μ΄λ¦ κ°μ Έμ€κΈ° -->
<select id="getFilename" parameterType="string" resultType="string">
SELECT FILENAME
FROM PDS
WHERE NEWFILENAME=#{newFilename}
</select>
<!-- μ‘°νμ μ¦κ° -->
<update id="readCount" parameterType="int">
UPDATE PDS
SET READCOUNT = READCOUNT + 1
WHERE SEQ=#{seq}
</update>
<!-- λ€μ΄λ‘λμ μ¦κ° -->
<update id="downloadCount" parameterType="int">
UPDATE PDS
SET DOWNCOUNT = DOWNCOUNT + 1
WHERE SEQ=#{seq}
</update>
<!-- λν
μΌ -->
<select id="getDetail" parameterType="int" resultType="bit.com.a.dto.PdsDto">
SELECT SEQ, ID, TITLE, CONTENT, FILENAME, NEWFILENAME, READCOUNT, DOWNCOUNT, REGDATE
FROM PDS
WHERE SEQ=#{seq}
</select>
<!-- μμ -->
<delete id="delete" parameterType="int">
DELETE FROM PDS
WHERE SEQ=#{seq}
</delete>
<!-- κΈμμ -->
<update id="update" parameterType="bit.com.a.dto.PdsDto">
UPDATE PDS
SET TITLE=#{title}, CONTENT=#{content}
<if test="filename != null and filename != '' and newFilename != null and newFilename != '' ">
, FILENAME=#{filename}, NEWFILENAME=#{newFilename}
</if>
WHERE SEQ=#{seq}
</update>
</mapper>
'π» κ°λ° > π TIL (Today I Learned)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
210427 TIL(D+74 μ€νλ§ ν¬ν ꡬν, Crawling, 컀μ€ν μ΄λ Έν μ΄μ νμ©ν AOP, μΉ μμΌ) (0) | 2021.04.27 |
---|---|
ajax νμ© μΊλ¦°λ λ§λ€κΈ° (1) | 2021.04.21 |