java 表单实现上传图片至服务器_表单上传文件到服务器

导包

b9bdb79a95ca?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

基本套路

// 拿到一个文件长传类的工厂

DiskFileItemFactory factory = new DiskFileItemFactory();

// Configure a repository (to ensure a secure temp location is used)

//文件上传的时候的临时文件夹

ServletContext servletContext = this.getServletConfig().getServletContext();

File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");

//把临时文件夹给到Factory使用

factory.setRepository(repository);

// Create a new file upload handler 使用工厂获取一个文件上传处理器

ServletFileUpload upload = new ServletFileUpload(factory);

try {

List items = upload.parseRequest(request);

for (FileItem fileItem : items) {

if (fileItem.isFormField()) { //simple form field.

processFormField(fileItem); // J基本的表单数据 文件除外

} else {

System.out.println("ApacheFileupload.doPost() processUploadedFile");

processUploadedFile(fileItem);// 该item是一个文件数据

}

}

} catch (FileUploadException e) {

e.printStackTrace();

}

处理函数

try {

InputStream inputStream = item.getInputStream();

String folderString = getServletContext().getRealPath("WEB-INF/upload");

File folder = new File(folderString);

if (!folder.exists()) {

folder.mkdir();

}

FileOutputStream fos = new FileOutputStream(folder+"/1.txt");

int len = 0;

byte[] bs = new byte[1024];

while((len=inputStream.read(bs))!=-1){

fos.write(bs, 0, len);

}

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

几个问题:

上述代码只是个基本上传,如何解决多用户上传文件重名问题?

使用系统时间毫秒数

String fileName = System.currentTimeMillis()+item.getFieldName();

使用JavaSE提供的UUID

UUID randomUUID = UUID.randomUUID();

String fileName = randomUUID.toString()+item.getFieldName();

其中UUID占128个二进制位,返回结果是32个长度的16进制表示的字符串,分隔符不算。因为每4位用来表示一个16进制数。形如

a328fcc7-bb0d-4205-995b-8d89a6d30056

如果用户上传的所有文件都存储在一个文件夹下,会不会很卡?

使用哈希算法使每次上传的文件散列到不用的文件夹下

private void processUploadedFile(FileItem item) {

try {

InputStream inputStream = item.getInputStream();

UUID uuid = UUID.randomUUID();

//文件可以均匀分布,经过这一步uuid看成散列了

//hashCode是32bit,也是得到8个十六进制字符

int hashCode = uuid.toString().hashCode();

//为了可以散列地创建文件夹,得到字符串

String hexString = Integer.toHexString(hashCode());

String realPath = getServletContext().getRealPath("WEB-INF/upload/");

//建立八级文件夹

char[] charArray = hexString.toCharArray();

for (char c : charArray) {

realPath=realPath+c+"/";

}

File folder = new File(realPath);

if (!folder.exists()) {

folder.mkdirs();

}

System.out.println(folder);

File file = new File(folder+"/"+item.getFieldName());

FileOutputStream fos = new FileOutputStream(file);

int len = 0;

byte[] bs = new byte[1024];

while((len=inputStream.read(bs))!=-1){

fos.write(bs, 0, len);

}

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

代码运行效果为

b9bdb79a95ca?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值