springMVC文件上传

MultipartFile   支持所有类型文件上传

pom依赖:

 

      <properties>
       <commons-fileupload.version>1.3.1</commons-fileupload.version>
       
        <lombok.version>1.18.2</lombok.version>
      </properties>

<!-- 文件上传组件 -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons-fileupload.version}</version>
            </dependency>
<!--lombok 依赖-->
 <!--自动  生成 set,get-->
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <scope>provided</scope>
            </dependency>

 

springmvc配置文件上传:

<!--&lt;!&ndash; 定义文件上传解析器 &ndash;&gt;-->
	<bean id="multipartResolver"
		  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设定默认编码 -->
		<property name="defaultEncoding" value="UTF-8"></property>
		<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
		<property name="maxUploadSize" value="5242880"></property>
	</bean>

 

 

后台:

controller:


@Controller
@RequestMapping("/util")
public class UtilController {
    @Autowired
    FileService fileService;

    /**
     *
     * @param prefix   文件保存的分类文件夹,比如picture
     * @param file
     * @return
     * @throws Exception
     */
    @RequestMapping("/upload/{prefix}")
    @ResponseBody
    public Result<FileUploadResult> uploaFile(@PathVariable String prefix,@RequestParam("file") MultipartFile file) throws Exception {

     return fileService.pictureUpload(file,prefix);
    }
}

FileService代码:

接口层


public interface FileService {
    Result<FileUploadResult> pictureUpload(MultipartFile src, String prefix) throws Exception;
}

 

实现层:

@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private HttpServletRequest request;

    //   public static  final String PICTURE_SAVE_PREFIX="picture";
    @Override
    public Result<FileUploadResult> pictureUpload(MultipartFile src, String prefix) throws Exception {

        String ipPort = "http://" + request.getRemoteHost() + ":" + request.getServerPort();
        //真实保存路径
        String realServerBasePath = request.getSession().getServletContext().getRealPath("");
        String resultPath = PictureUploadUtil.pictureUpload(ipPort, prefix, realServerBasePath, src);
        if (StringUtils.isEmpty(resultPath)) {
            return Result.error(-1, "文件上传失败");
        }
        FileUploadResult result = new FileUploadResult();
        result.setDownloadUrl(resultPath);
        return Result.success(result);
    }

}

PictureUploadUtil:


/**
 * 图片上传工具类,
 */

public class PictureUploadUtil {

    /**
     * @param prefix   各类型文件 在项目中的根文件夹名,方便分类存放  比如  /pic,如果prefix为  pic
     *                 则fileSaveDir:E:\学习文档\测试文件\pic\2018\09\19
     * @param savePath 保存文件的根目录,一般需要使用Context.getRealPath("") 来获取
     * @param src      源文件
     * @return
     */

    public static String pictureUpload(String ipPort, String prefix, String savePath, MultipartFile src) throws Exception {

        if (src.isEmpty()) {
            throw new Exception("MultipartFile is empty");
        }
        String dateDir = getDirsNameByDate(prefix);
        String fileSaveDir = savePath + dateDir;
        String newName = buildFileName(src.getOriginalFilename());
        System.out.println("fileSaveDir:" + fileSaveDir);
        //真实路径是:savePath+dateDir+newName
        //下载只需要:ip:port/dateDir/newName
        String downloadUrl = ipPort + "/" + dateDir + "/" + newName;
        File dirs = new File(fileSaveDir);
        if (!dirs.exists()) {
            dirs.mkdirs();
        }
        String realSavePath = fileSaveDir + File.separator + newName;
        System.out.println("realSavePath:" + realSavePath);
        Path path = Paths.get(realSavePath);
        try {
            Files.write(path, src.getBytes());
        } catch (IOException e) {
            downloadUrl = null;
            e.printStackTrace();
        }
        return downloadUrl;
    }

    /**
     * @param prefix 根文件夹名字(分类存放,比如  /pic)
     * @return
     */
    private static String getDirsNameByDate(String prefix) {
        Date now = new Date();
        String dateString = new SimpleDateFormat("yyyy/MM/dd").format(now).toString();
        String result = dateString;
        if (!StringUtils.isEmpty(prefix)) {
            result = prefix + File.separator + dateString;
        }

        System.out.println("getDirsNameByDate:" + result);
        return result;
    }

    /**
     * @return 获取文件名后缀
     * @created 15:26 2018/9/19
     * @author wangwei
     * @params
     */
    private static String getFileSuffix(String fileName) {
        System.out.println("fileName:" + fileName);
        if (StringUtils.isEmpty(fileName)) {
            return null;
        }
        return fileName.substring(fileName.lastIndexOf('.'));
    }

    private static void fileCopy(File source, File dest) throws IOException {
        FileChannel inputChannel = null;
        FileChannel outputChannel = null;
        try {
            inputChannel = new FileInputStream(source).getChannel();
            outputChannel = new FileOutputStream(dest).getChannel();
            outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
        } finally {
            inputChannel.close();
            outputChannel.close();
        }


    }

    /**
     * @param originName
     * @return 生成文件名
     */
    private static String buildFileName(String originName) {
        return System.currentTimeMillis() + getFileSuffix(originName);
    }

   
}

返回结果封装类:


/**
*@author wangwei
*@created 14:31 2018/9/19
 *@classname FileUploadResult
*@classdescription  文件上传返回结果
*
*/
@Data
public class FileUploadResult {
    private String fileName;
    private String savePath;
    //可以下载的url
    private String  downloadUrl;
    private String   url;

}

测试:

测试效果:

以图片上传为例

(使用postman测试)

控制台输出:

注意红色的pic,这是我在上传路径中指定的图片文件保存根目录名)

getDirsNameByDate:pic\2018/09/19
fileName:2_abumdshahnoorshawon-lilacbreastedroller.jpg
fileSaveDir:E:\学习文档\项目\ideasvnchekcout\code\buybuybuy\build-ssm\classes\artifacts\build_ssm_Web_exploded\pic\2018/09/19
realSavePath:E:\学习文档\项目\ideasvnchekcout\code\buybuybuy\build-ssm\classes\artifacts\build_ssm_Web_exploded\pic\2018/09/19\1537360876620.jpg

返回结果:

{
    "data": {
        "fileName": null,
        "savePath": null,
        "downloadUrl": "http://127.0.0.1:8080/pic\\2018/09/19/1537360876620.jpg",
        "url": null
    },
    "msg": "操作成功",
    "code": -1,
    "success": true
}

测试浏览器访问:

测试一个压缩包上传:

控制台输出:

注意红色的zip,这是我在上传路径中指定的.zip文件保存根目录名)

fileName:applicationContext-shiro.zip
fileSaveDir:E:\学习文档\项目\ideasvnchekcout\code\buybuybuy\build-ssm\classes\artifacts\build_ssm_Web_exploded\zip\2018/09/19
realSavePath:E:\学习文档\项目\ideasvnchekcout\code\buybuybuy\build-ssm\classes\artifacts\build_ssm_Web_exploded\zip\2018/09/19\1537360989065.zip

返回结果:

{
    "data": {
        "fileName": null,
        "savePath": null,
        "downloadUrl": "http://127.0.0.1:8080/zip\\2018/09/19/1537360989065.zip",
        "url": null
    },
    "msg": "操作成功",
    "code": -1,
    "success": true
}

测试访问:

真实文件保存情况:

最终看看真实的目录文件是啥样的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值