<br>这样,用户只需在文件选择窗口中选择一个文本文件即可。然而,为了确保系统安全,仅仅在界面上阻止用户是不敷的。有必要在背景重新验证上传的文件,看看用户是否上传了文本文件。我们需要解决的问题是确定用户上传文件的实际类型。<br>开始<br>说明上述问题,我们将建立一个演示系统,前端使用 React.js,后端使用 Java/Spring Boot。<br>
real.png -> fake.txt <br>real.jpg -> fake.zip <br>real.svg -> fake.docx<br>背景文件类型确定<br> 项目的背景系统使用 Spring Boot 以 Java 编写。还实现了一个控制器,用于吸收用户的上传哀求。<br>
@Slf4j<br>@RestController<br>public class UploadController {<br> @PostMapping(path = "/check-file-type", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)<br> public ResponseEntity < Response > checkFileType(@RequestPart MultipartFile file) {<br> // to be implemented<br> }<br>}<br>以及将效果返回给用户的相应<br>
@Data<br>@NoArgsConstructor<br>@AllArgsConstructor<br>public class Response {<br> private int status;<br> private String message;<br> private String mimeType;<br> public Response(String mimeType) {<br> this.status = HttpStatus.OK.value();<br> this.message = "Successful";<br> this.mimeType = mimeType;<br> }<br>}<br>使用用户代理定义的 MIME 类型 <br>当从 input[type=file] 中选择文件时,文件类型已由浏览器(用户代理)根据 MIME 类型格式确定,然后通过 Content-Type 哀求头传输到后端。因此,控制器参数中的 MultipartFile 类已经包含了文件类型的信息。<br>现在,您可以使用 getContentType() 根据 MIME 类型确定文件类型。<br>
@PostMapping(path = "/check-file-type", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)<br>public ResponseEntity < Response > checkFileType(@RequestPart MultipartFile file) {<br> String mimeType = file.getContentType();<br> return ResponseEntity.ok(new Response(mimeType));<br>}<br>让我们测试一下上面准备的文件<br>
魔数(Magic number)<br>文件名扩展名(File name extension):部门基于文件扩展名<br>从互联网下载文件的元数据(Metadata)<br>定义容器及其内容(container)<br>要在 Maven 项目中使用 Tika,可以在 pom.xml 中添加依赖关系:<br>
<br> org.apache.tika<br> tika-core<br> 2.1.0<br><br>因此,我们可以编写更多的函数,在文件上传到系统时确定文件的精确 MIME 类型。<br>
public class FileUtils {<br> public static String getRealMimeType(MultipartFile file) {<br> AutoDetectParser parser = new AutoDetectParser();<br> Detector detector = parser.getDetector();<br> try {<br> Metadata metadata = new Metadata();<br> TikaInputStream stream = TikaInputStream.get(file.getInputStream());<br> MediaType mediaType = detector.detect(stream, metadata);<br> return mediaType.toString();<br> } catch (IOException e) {<br> return MimeTypes.OCTET_STREAM;<br> }<br> }<br>}<br>在背景再创建一个 API,并使用 Tika 来辨认 MIME 类型。<br>
@PostMapping(path = "/check-real-type", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)<br>public ResponseEntity < Response > checkRealType(@RequestPart MultipartFile file) {<br> String mimeType = FileUtils.getRealMimeType(file);<br> return ResponseEntity.ok(new Response(mimeType));<br>}<br>然后,编辑用户界面,使用新创建的 API 将文件上传到背景,并用一些文件再次进行测试:<br>
spring.servlet.multipart.max-file-size=10MB<br>spring.servlet.multipart.max-request-size=10MB<br>扩展和类型验证 <br>
# Example for Bootstrap-Vue <br><br><br>
3.设置精确的 Content-Type 类型,从文件中提取,而不是使用 Content-Type 标头。思量使用 Apache Tika。<br>复制代码
- <font size="3"># Using Apache Commons IO. </font>
复制代码
- <font size="3">Returns "pdf"</font>
复制代码
- <font size="3"><strong>import </strong>org.apache.commons.io.FilenameUtils;</font>
复制代码
- <font size="3">String extension = FilenameUtils.getExtension("test.pdf");</font>
复制代码
- <font size="3"><strong>import </strong>java.io.ByteArrayInputStream;<br><strong>import </strong>java.io.IOException;<br><strong>import </strong>org.apache.tika.config.TikaConfig;<br><strong>import </strong>org.apache.tika.detect.Detector;<br><strong>import </strong>org.apache.tika.io.TikaInputStream;<br><strong>import </strong>org.apache.tika.metadata.Metadata;<strong>public static </strong>String getContentType(<strong>byte</strong>[] fileBytes, String filenameWithExtension) <strong>throws </strong>IOException {<br> TikaConfig config = TikaConfig.getDefaultConfig();<br> Detector detector = config.getDetector();<br> TikaInputStream stream = TikaInputStream.get(<strong>new </strong>ByteArrayInputStream(fileBytes));<br> Metadata metadata = <strong>new </strong>Metadata();<br> metadata.add(Metadata.RESOURCE_NAME_KEY, filenameWithExtension);<br> <strong>return </strong>detector.detect(stream, metadata).toString();<br>}</font>
复制代码
- <font size="3"># Always has length 36 and is limited to 23 chars<strong>import </strong>java.util.UUID;<br><strong>public static </strong>String createUniqueFilename(String extension) {<br> <strong>return </strong>UUID.<em>randomUUID</em>().toString() + <strong>"." </strong>extension;<br>}</font>
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |