限定文件上传类型,文件的上传

限制上传类型 & 多选:

① accept 属性只能与 <input type="file" /> 配合使用。它规定能够通过文件上传进行提交的文件类型。
② multiple 属性规定输入字段可选择多个值。

示例:

<!--
      image/*     所有图片
      image/png   png图片
      image/jpg   jpg图片
      image/gif   gir动图
      application/msword  Word文档(.doc)
      application/vnd.openxmlformats-officedocument.wordprocessingml.document     Word文档(.docx)
      application/vnd.ms-excel    Excel文档(.xls)
      application/vnd.openxmlformats-officedocument.spreadsheetml.sheet   Excel文档(.xlsx)
      application/vnd.ms-powerpoint   PPT文档(.ppt)
      application/vnd.openxmlformats-officedocument.presentationml.presentation   PPT文档(.pptx)
      application/zip     压缩文件
      text/plain  文本文件
      text/html   HTML文件
      text/css    css文件
      application/pdf    pdf文件
      audio/*     音频文件
      video/*     视频文件
  -->
  <input  id="files"
          type="file"
          accept="image/*,
                  application/msword,
                  application/vnd.openxmlformats-officedocument.wordprocessingml.document,
                  application/vnd.ms-excel,
                  application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
                  application/vnd.ms-powerpoint,
                  application/vnd.openxmlformats-officedocument.presentationml.presentation, application/zip,
                  text/plain,
                  text/html,
                  text/css,
                  application/pdf,
                  audio/*,
                  video/*"
          multiple />

文件的上传(照片上传),文件上传照片上传

1.文本的上传
   [1] 简介
      > 将二个客户端的本土的文本发送到服务器中保存。
       > 上传文件是经过流的款式将文件发送给服务器。
 
   [2] 表单的设置
      > 向服务器上传一个文书时,表单要选择post请求。
      > 表单的暗中认可属性enctype=”application/x-www-form-urlencoded”
       – 这一个特性的意味是请求体中的内容将会采取UWranglerL编码
      > 上传文件的表单enctype必要设置为 multipart/form-data
     – multipart/form-data表示的是表单是三个多部件的表单
     –
若是类型设置为它,则大家的每三个表单项都会作为1个独门的部件发送给服务器。
     – 三个部件之间采取类似 —————————–7df2d08c0894分割符来分别
     >
当表单设置为multipart/form-data时,大家request.getParameter()将失效,大家不可能再通过该格局赢得请求参数。

   [澳门葡京,3] FileUpload
     >
大家一般景观下行使commons-fileupload-1.3.1.jar那么些工具来分析多部件请求。
     > fileupload 信赖 commons-io
所以大家假诺Filtupload供给同时导入io包。
     > 核心类:
   DiskFileItemFactory
    – 工厂类,用于构建1个解析器实例。
    
   ServletFileUpload
    – 解析器类,通过此类实例来解析request中的请求音讯。
    
   FileItem
    –
工具会将大家恳请中每二个部件,都打包为贰个FileItem对象,处理公事上传时,只供给调用该对象的主意
    – 方法:
     boolean isFormField()  –>
当前表单项是不是是一个普通表单项,true是普通表单项, false是文件表单项
     String getContentType() –> 重临的是文本的品类,是MIME值
     String getFieldName()   –> 获取表单项的name属性值
     String getName()   –> 获取上传的公文的名字
     long getSize()          –> 获取文件的深浅
     String getString(String encoding) –>
获取表单项的value属性值,需求经受一个编码作为参数。
     void write(File file)    –> 将表单项中的内容写入到磁盘中
    
  > 使用手续:
   1.到手工业厂类实例[DiskFileItemFactory]
   2.拿走解析器类实例[ServletFileUpload]
   3.解析request获取FileItem[限定文件上传类型,文件的上传。parseRequest()]

[4] 细节
  第②个难题
  > 部分浏览器会将文件的总体路径作为文件名发送。
   C:\Users\lilichao\Desktop\day20\图片\蒙娜Lisa.jpg
  >
像那类文件名我们须要截取一下字符串,只得到名字那有的,而不须要获得路径部分的新闻。
   通过如下代码对文本名举行截取字符串的操作:
    if(name.contains(“\\”)){
     //要是包括则截取字符串
     name = name.substring(name.lastIndexOf(“\\”)+1);
    }
    
  第②个难点
  > 上传的文件有只怕出现重名,后上传的文书会将先上传的文书覆盖。
  > 解决:给文件名加贰个唯一的前缀。
    唯一标识_fennu.jpg
    UUID_fennu.jpg
  
  第⑤个难题
  > 有个别情形要求限制上传文件的大大小小。
   – 设置单个文件大小为50KB:
    fileUpload.setFileSizeMax(1024*50);
   –
设置完单个文件大小限制之后,一旦上传的文件超越限定,则会抛出如下极度:
    FileSizeLimitExceededException
    全数能够对该特别举办捕获,当出现该尤其时则设置叁个错误新闻。
   
   – 设置五个文件的总大小为150KB
    fileUpload.setSizeMax(1024*150);
   – 当多少个公文的分寸超出范围时,会抛出如下万分
    SizeLimitExceededException
    
  第七个难题
   > 当用户上传贰个空的文书,依旧会将文件保留到硬盘上。
   > 在保存文件应抢先对文本的尺寸进行判断,假设size为0,则不处理。

 

上边是代码完毕部分:

  Servlet里面包车型客车始末:

澳门葡京 1

 1 package com.neuedu.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.List;
 6 import java.util.UUID;
 7 
 8 import javax.servlet.ServletContext;
 9 import javax.servlet.ServletException;
10 import javax.servlet.annotation.WebServlet;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 
15 import org.apache.commons.fileupload.FileItem;
16 import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
17 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
18 import org.apache.commons.fileupload.FileUploadException;
19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
21 
22 
23 
24 
25 
26 @WebServlet("/FileUploadServlet")
27 public class FileUploadServlet extends HttpServlet {
28     private static final long serialVersionUID = 1L;
29        
30 
31 
32     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
33         //1.创建工厂类
34         DiskFileItemFactory factory=new DiskFileItemFactory();
35         //2.创建ServletFilUpload对象,通过这个对象完成上传功能。
36         ServletFileUpload fileUpload=new ServletFileUpload(factory);
37 //        fileUpload.setFileSizeMax(1024*50);
38         fileUpload.setSizeMax(1024*150);
39         ServletContext servletContext = request.getServletContext();
40         String realPath = servletContext.getRealPath("/upload");
41         System.out.println(realPath);
42         File file=new File(realPath);
43         if(!file.exists())
44         {
45             file.mkdirs();
46         }
47         //2.用这个fileUpload对象解析request请求
48         try {
49             List<FileItem> fileList = fileUpload.parseRequest(request);
50            for(FileItem item:fileList)
51            {
52               if(item.isFormField()){
53                   //代表普通表单项
54                   String name=item.getFieldName();
55                   String value=item.getString("utf8");
56                   System.out.println(name+":"+value);
57                   
58               }else {
59                 //代表上传的文件
60                   long size=item.getSize();
61                   if(size==0){
62                       continue;
63                   }
64                   String contentType = item.getContentType();
65                   String name = item.getName();
66                   if(name.contains("\\")){
67                       name=name.substring(name.lastIndexOf("\\")+1);
68                       
69                   }
70                   //uuid_name.jpg
71                   String prefix = UUID.randomUUID().toString();
72                   prefix=prefix.replace("-", "");
73                   String fileName=prefix+"_"+name;
74                   String fieldName=item.getFieldName();
75                   System.out.println(size+":"+contentType+":------------"+name+":"+fieldName);
76                   try {
77                     item.write(new File(realPath+"\\"+fileName));
78                 } catch (Exception e) {
79                     // TODO Auto-generated catch block
80                     e.printStackTrace();
81                 }
82                   
83             }
84            }
85         } catch (FileSizeLimitExceededException e)
86         {
87             System.out.println("文件大小不可以超过50k");
88         }
89         catch (SizeLimitExceededException e) {
90             System.out.println("文件大小不可以超过150K");
91         }
92         
93         catch (FileUploadException e) {
94             // TODO Auto-generated catch block
95             e.printStackTrace();
96         }
97     }
98 
99 }

FileUploadServlet.java

JSP里面包车型客车剧情:

澳门葡京 2

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 <form action="${pageContext.request.contextPath}/FileUploadServlet" method="post" enctype="multipart/form-data">
11   用户名:<input type="text" name="username"/><br/>
12 <input type="file" name="photo"><br/>
13 <input type="file" name="photo1"><br/>
14 <input type="file" name="photo2"><br/>
15 <input type="submit" value="提交">
16 </form>
17 </body>
18 </html>

index.jsp

 

1.文件的上传 [1] 简介 将三个客户端的地点的文书发送到服务器中保留。
上传文件是透过流的…

  1. private void
    button1_Click(object sender, EventArgs e)
  2.         {
  3.            
    //判断是还是不是打开对话框
  4.             if
    (this.openFileDialog1.ShowDialog() == DialogResult.OK)
  5.            
    {
  6.                
    //文本框获取打开的公文的门路
  7.                
    this.textBox1.Text = this.openFileDialog1.FileName;
  8.            
    }
  9.         }

一 NSURLSessionUploadTask概述

 

1.1NSMutableURLRequest

图片上传前预览:

示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> -->
    <style type="text/css">
    html,
    body {
        margin: 0;
        padding: 0;
    }

    .tip {
        width: 100%;
        text-align: center;
    }

    .main {
        box-sizing: border-box;
        display: flex;
        flex-wrap: wrap;
        justify-content: flex-start;
        align-items: center;
        border: 2px dotted red;
        padding: 20px;
    }

    .add {
        width: 100px;
        height: 100px;
        border: 2px solid #333;
        box-sizing: border-box;
        font-size: 100px;
        line-height: 100px;
        font-weight: 100;
        color: #333;
        display: flex;
        justify-content: center;
        align-items: center;
        cursor: pointer;
    }

    .form {
        display: none;
    }
    </style>
</head>

<body>
    <div class="tip"></div>
    <div class="main">
        <div class="add">+</div>
        <form class="form"></form>
    </div>
</body>

</html>
<script type="text/javascript">
//判断浏览器是否支持FileReader接口
if (typeof FileReader == 'undefined') {
    $(".tip").html("<h1>当前浏览器不支持FileReader接口</h1>");
}
var index = 0;
$(".add").click(function(e) {
    if (!$("#upload")[0]) {
        $(".form").append("<input id='upload' class='num" + (++index) + "' onchange='showImg(this)' type='file' accept='image/*' />");
    }
    $("#upload").click();
});
// 展示图片
function showImg(el) {
    var reader = new FileReader();
    //读取文件过程方法
    reader.onloadstart = function(e) {
        console.log("开始读取....");
    };
    reader.onprogress = function(e) {
        console.log("正在读取中....");
    };
    reader.onabort = function(e) {
        console.log("中断读取....");
    };
    reader.onerror = function(e) {
        console.log("读取异常....");
    };
    reader.onload = function(e) {
        console.log("成功读取....");
        // console.log(e);
        var img = "<img class='img num" + index + "' width='100px' height='100px' onclick='del(" + index + ")' src='" + e.target.result + "' alt=''>";
        $(img).insertBefore('.add');
    };
    reader.readAsDataURL(el.files[0]);
    $(el).removeAttr('id');
}
// 删除图片并删除对应隐藏的input
function del(cls){
    $(".num" + cls).remove();
}
</script>

注意:如果不选图片,点取消的时候,上例中会有一个多余的input,表单提交的时候,记得把没有值的 input 删除掉。

 

上传数据的时候,一般要利用REST
API里的PUT大概POST方法。所以,要通过那几个类来安装有个别HTTP配置新闻。常见的归纳

timeoutInterval //timeout的小运间隔

HTTPMethod //HTTP方法

//设置HTTP表头音信

– addValue:forHTTPHeaderField:

– setValue:forHTTPHeaderField:

HTTP header的求实消息参见Wiki,常用的header一定要熟谙

1.2 二种上传数据的点子

NSData - 如果目的已经在内部存储器里

动用以下三个函数早先化

uploadTaskWithRequest:fromData:

uploadTaskWithRequest:fromData:completionHandler:

Session会自动总计Content-length的Header

日常,还需求提供一些服务器要求的Header,Content-Type就反复须求提供。

File-假使对象在磁盘上,这样做兴妖作怪下降内部存款和储蓄器使用。

应用以下三个函数举行初步化

uploadTaskWithRequest:fromFile:

uploadTaskWithRequest:fromFile:completionHandler:

无差异于,会自动总括Content-Length,倘诺App没有提供Content-Type,Session会自动成立3个。借使Server需求额外的Header信息,也要提供。

Stream

使用那几个函数创设

uploadTaskWithStreamedRequest:

小心,那种状态下必将要提供Server需求的Header音信,例如Content-Type和Content-Length。

接纳Stream一定要贯彻那么些代理方法,因为Session不能够在再一次尝试发送Stream的时候找到数据源。(例如需求授权音讯的动静)。那些代理函数,提供了Stream的数据源。

URLSession:task:needNewBodyStream:

1 .3 代理方法

采纳那一个代理方法取得upload的进程。别的的代办方法

NSUCRUISERLSessionDataDelegate,NSU中华VLSessionDelegate,NSUSportageLSessionTaskDelegate同样适用于UploadTask

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask
*)task didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;

二 上传数据

主导代码如下

NSMutableURLRequest * request = [NSMutableURLRequest
requestWithURL:[NSURL
URLWithString:@];

[request addValue:@application/json
forHTTPHeaderField:@Content-Type];//这一行一定不可能少,因为背后是更换来JSON发送的

[request addValue:@application/json forHTTPHeaderField:@Accept];

[request setHTTPMethod:@POST];

[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];

[request setTimeoutInterval:20];

NSDictionary * dataToUploaddic =
@{self.keytextfield.text:self.valuetextfield.text};

NSData * data = [NSJSONSerialization
dataWithJSONObject:dataToUploaddic

options:NSJSONWritingPrettyPrinted

error:nil];

NSURLSessionUploadTask * uploadtask = [self.session
uploadTaskWithRequest:request fromData:data completionHandler:^(NSData
*data, NSURLResponse *response, NSError *error) {

if (!error) {

NSDictionary *dictionary = [NSJSONSerialization
JSONObjectWithData:data options:kNilOptions error:nil];

self.responselabel.text = dictionary.description;

}else{

UIAlertController * alert = [UIAlertController
alertControllerWithTitle:@Error message:error.localizedFailureReason
preferredStyle:UIAlertControllerStyleAlert];

[alert addAction:[UIAlertAction actionWithTitle:@OK
style:UIAlertActionStyleCancel handler:nil]];

[self presentViewController:alert animated:YES completion:nil];

}

}];

[uploadtask resume];

三 上传图片

主导部分代码

NSMutableURLRequest * request = [NSMutableURLRequest
requestWithURL:[NSURL
URLWithString:@];

[request addValue:@image/jpeg forHTTPHeaderField:@Content-Type];

[request addValue:@text/html forHTTPHeaderField:@Accept];

[request setHTTPMethod:@POST];

[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];

[request setTimeoutInterval:20];

NSData * imagedata =
UIImageJPEGRepresentation(self.imageview.image,1.0);

NSURLSessionUploadTask * uploadtask = [self.session
uploadTaskWithRequest:request fromData:imagedata
completionHandler:^(NSData *data, NSURLResponse *response, NSError
*error) {

NSString * htmlString = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];

UploadImageReturnViewController * resultvc = [self.storyboard
instantiateViewControllerWithIdentifier:@resultvc];

resultvc.htmlString = htmlString;

[self.navigationController pushViewController:resultvc animated:YES];

self.progressview.hidden = YES;

[self.spinner stopAnimating];

[self.spinner removeFromSuperview];

}];

[uploadtask resume];

代办函数

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask
*)task didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{

self.progressview.progress =
totalBytesSent/(float)totalBytesExpectedToSend;

}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website