java io上传图片_java后台图片的上传预览接口 IO流

上传图片接口    图片保存到服务器(适用于任何文件)

/**

* 上传医生照片

* @param request

* @return

* @throws Exception

* @throws IOException

*/

@RequestMapping(value = "uploadfile")

public Object uploadfile(HttpServletRequest request) throws Exception, IOException {

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

String logoPathDir = fileConfig.getPersonImageURL(); //从配置文件中获取服务器保存路径

// 根据真实路径创建目录

File logoSaveFile = new File(logoPathDir);

if (!logoSaveFile.exists()){

logoSaveFile.mkdirs();

}

// 页面控件的文件流

MultipartFile multipartFile = multipartRequest.getFile("file");

// 获取文件的后缀

String suffix = multipartFile.getOriginalFilename().substring(

multipartFile.getOriginalFilename().lastIndexOf("."));

// 使用UUID生成文件名称

String logImageName = UUID.randomUUID().toString() + suffix;// 构建文件名称

// 拼成完整的文件保存路径加文件

String fileName = logoPathDir + logImageName;

File file = new File(fileName);

try {

multipartFile.transferTo(file);

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

// 打印出上传到服务器的文件的绝对路径

Map result=new HashMap();

result.put("imgname", logImageName);

result.put("imgnamepath", fileName);

result.put("message", "上传成功");

result.put("statu", 1);

return result;

}

第二种写法 io流

/**

* 上传版本文件

* @param request

* @param response

* @return

* @throws Exception

* @throws IOException

*/

@RequestMapping(value = "uploadfiledemo")

public Object uploadfiledemo(HttpServletRequest request,MultipartHttpServletRequest multiReq,HttpServletResponse response) throws Exception, IOException {

// 获取上传文件的路径

String uploadFilePath = multiReq.getFile("file").getOriginalFilename();

// 截取上传文件的后缀

String uploadFileSuffix = uploadFilePath.substring(

uploadFilePath.lastIndexOf("."));

// 使用UUID生成文件名称

String filename = UUID.randomUUID().toString() + uploadFileSuffix;// 构建文件名称

FileOutputStream fos = null;

FileInputStream fis = null;

try {

fis = (FileInputStream) multiReq.getFile("file").getInputStream();

fos = new FileOutputStream(new File(fileConfig.getAppFileURL() + filename));

byte[] temp = new byte[1024];

int i = fis.read(temp);

while (i != -1) {

fos.write(temp, 0, temp.length);

fos.flush();

i = fis.read(temp);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fos != null) {

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

// 打印出上传到服务器的文件的绝对路径

Map result=new HashMap();

result.put("appFileName", filename);//文件名称

result.put("appFilePath", fileConfig.getAppFileURL() + filename);//文件带路径的名称

result.put("message", "上传成功");

result.put("statu", 1);

return result;

}

------------------------------------------------------------------------------------------------------------------------------------------

图片预览接口 不需return 将文件流输出即可

/**

* 传入要预览的图片名称

*

* @param path

*/

@RequestMapping(value = "/downloadpicture")

private void downloadPicture(String path, HttpServletResponse response) throws IOException {

//获取文件保存路径

String logoPathDir = fileConfig.getPersonImageURL();

path = logoPathDir + path; //获取服务器上指定的图片路径

InputStream in = null;

ServletOutputStream sos = null;

try {

File file = new File(path);

in = new FileInputStream(file);

sos = response.getOutputStream();

byte[] b = new byte[1024];

while (in.read(b) != -1) {

sos.write(b); //输出

}

sos.flush(); //刷新

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

in.close(); //关闭文件读取流,输出流

sos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

---------------------------------------------------------------------------------------------------------------------------------------

文件下载 保存到本地 需要设置文件头,后缀名等信息 无法使用 文件需要使用FileInputStream

/**

* 传入要下载的app文件的url,将url所对应的文件下载到本地

*

* @param path

*/

@RequestMapping(value = "/downloadappfile")

private void downloadappfile(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {

//获取文件保存路径

String logoPathDir = fileConfig.getAppFileURL();

path = logoPathDir + path;

InputStream in = null;

ServletOutputStream sos = null;

try {

File file = new File(path);

response.setCharacterEncoding("utf-8");

//设置Content-Disposition

response.setHeader("Content-Disposition", "attachment;filename="+file.getName());

//设置文件MIME类型

response.setContentType(new MimetypesFileTypeMap().getContentType(file));

in = new FileInputStream(file);

sos = response.getOutputStream();

byte[] b = new byte[1024];

while (in.read(b) != -1) {

sos.write(b);

}

sos.flush();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

in.close();

sos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

第二种写法  使用BufferedInputStream改善读取性能

/**

* 传入要下载的app文件的url,将url所对应的文件下载到本地

* @param path

*/

@RequestMapping(value = "/downloadappfiledemo")

private void downloadappfiledemo(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {

//获取文件保存路径

String logoPathDir = fileConfig.getAppFileURL();

path = logoPathDir + path;

response.setHeader("content-type", "application/octet-stream");

response.setContentType("application/octet-stream");

byte[] buff = new byte[1024];

BufferedInputStream bis = null;

OutputStream os = null;

try {

File file = new File(path);

response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());

os = response.getOutputStream();

bis = new BufferedInputStream(new FileInputStream(file));

int i = bis.read(buff);

while (i != -1) {

os.write(buff, 0, buff.length);

os.flush();

i = bis.read(buff);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

bis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

InputStream不可以读取文件,它是一个Abstract的类,根本不可能实例化,是所有输入流的基类。而FileInputStream是InputStream的一个实现类,用于读取诸如图像数据之类的原始字节流。

第三种写法

write的flush,是想要不关闭write流的情况下,将已写入缓存的内容发出去。read只是读操作,没有flush。

out不关,是因为out来自socket,socket关了,就不用再关一次out了

/**

* 传入要下载的app文件的url,将url所对应的文件下载到本地

* @param path

*/

@RequestMapping(value = "/downloadappfile")

private Object downloadappfile(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {

//获取文件保存路径

String logoPathDir = fileConfig.getAppFileURL();

path = logoPathDir + path;

File file = new File(path);

//如果文件不存在

if(!file.exists()){

return new Response("999999","系统找不到指定文件");

}

response.reset(); // 必要地清除response中的缓存信息

response.setContentType("application/octet-stream; charset=utf-8");

response.setCharacterEncoding("utf-8");

// 设置response的Header

response.setHeader("Content-Disposition", "attachment;filename="+file.getName());

response.addHeader("Content-Length", "" + file.length()); //设置请求头信息写入文件大小

FileInputStream fis = null;

BufferedInputStream bis = null;

try {

fis = new FileInputStream(file);

byte[] buffer = new byte[1024];

bis = new BufferedInputStream(fis);

OutputStream os=response.getOutputStream();

int i = bis.read(buffer);

while (i != -1) {

os.write(buffer, 0, i);

i = bis.read(buffer);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (bis != null) {

try {

bis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return null;

}

------------------------------------------------------------------------------------------------------------------

多文件上传

public static String upload(HttpServletRequest request, String DirectoryName) throws IllegalStateException,

IOException {

// 创建一个通用的多部分解析器

CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession()

.getServletContext());

// 图片名称

String fileName = null;

// 判断 request 是否有文件上传,即多部分请求

if (multipartResolver.isMultipart(request)) {

// 转换成多部分request

MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;

// 取得request中的所有文件名

Iterator iter = multiRequest.getFileNames();

while (iter.hasNext()) {

// 记录上传过程起始时的时间,用来计算上传时间

// int pre = (int) System.currentTimeMillis();

// 取得上传文件

MultipartFile file = multiRequest.getFile(iter.next());

if (file != null) {

// 取得当前上传文件的文件名称

String myFileName = file.getOriginalFilename();

// 如果名称不为“”,说明该文件存在,否则说明该文件不存在

if (myFileName.trim() != "") {

// 获得图片的原始名称

String originalFilename = file.getOriginalFilename();

// 获得图片后缀名称,如果后缀不为图片格式,则不上传

String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();

if (!fileTypes.contains(suffix)) {

continue;

}

// 获得上传路径的绝对路径地址(/upload)-->

String realPath = request.getSession().getServletContext().getRealPath("/" + DirectoryName);

System.out.println(realPath);

// 如果路径不存在,则创建该路径

File realPathDirectory = new File(realPath);

if (realPathDirectory == null || !realPathDirectory.exists()) {

realPathDirectory.mkdirs();

}

// 重命名上传后的文件名 111112323.jpg

fileName = UUID.randomUUID().toString() + suffix;// 构建文件名称

// 定义上传路径 .../upload/111112323.jpg

File uploadFile = new File(realPathDirectory + "\\" + fileName);

System.out.println(uploadFile);

file.transferTo(uploadFile);

}

}

// 记录上传该文件后的时间

// int finaltime = (int) System.currentTimeMillis();

// System.out.println(finaltime - pre);

}

}

return fileName;

}

------------------------------------------------------------------------------------------------------------------------------------------

Java IO 的一般使用原则 :

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么: 原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值