java 上传pdf文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5038798/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 09:08:46  来源:igfitidea点击:

uploading of pdf file

javajspfile-upload

提问by neha soni

i want to upload a pdf file by using code given below.It give browsing facility but dont upload file. When i click sendfile button Its display uploadfile.html code page. How can i do that??? where is the error in the given code???

我想使用下面给出的代码上传 pdf 文件。它提供浏览功能但不上传文件。当我单击 sendfile 按钮时,它会显示 uploadfile.html 代码页。我怎样才能做到这一点???给定代码中的错误在哪里???

filename-upload.html

文件名-upload.html

<%@ page language="java" %>
<HTml>
<HEAD><TITLE>Display file upload form to the user</TITLE></HEAD>  
<% //  for uploading the file we used Encrypt type of multipart/
form-data and input of file type to browse and submit the file %>
  <BODY> <FORM  ENCTYPE="multipart/form-data" ACTION=
"uploadfile.html" METHOD=POST>
        <br><br><br>
      <center><table border="2" >
                    <tr><center><td colspan="2"><p align=
"center"><B>PROGRAM FOR UPLOADING THE FILE</B><center></td></tr>
                    <tr><td><b>Choose the file To Upload:</b>
</td>
                    <td><INPUT NAME="F1" TYPE="file"></td></tr>
                    <tr><td colspan="2">
<p align="right"><INPUT TYPE="submit" VALUE="Send File" ></p></td></tr>
             <table>
     </center>      
     </FORM>
</BODY>
</HTML>

filename--uploadfile.html

文件名--uploadfile.html

<%@ page import="java.io.*" %>
<%
    //to get the content type information from JSP Request Header
    String contentType = request.getContentType();
    //here we are checking the content type is not equal to Null and
 as well as the passed data from mulitpart/form-data is greater than or
 equal to 0
    if ((contentType != null) && (contentType.indexOf("multipart/
form-data") >= 0)) {
        DataInputStream in = new DataInputStream(request.
getInputStream());
        //we are taking the length of Content type data
        int formDataLength = request.getContentLength();
        byte dataBytes[] = new byte[formDataLength];
        int byteRead = 0;
        int totalBytesRead = 0;
        //this loop converting the uploaded file into byte code
        while (totalBytesRead < formDataLength) {
            byteRead = in.read(dataBytes, totalBytesRead, 
formDataLength);
            totalBytesRead += byteRead;
            }

        String file = new String(dataBytes);
        //for saving the file name
        String saveFile = file.substring(file.indexOf("filename=\
"") + 10);
        saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
        saveFile = saveFile.substring(saveFile.lastIndexOf("\")
 + 1,saveFile.indexOf("\""));
        int lastIndex = contentType.lastIndexOf("=");
        String boundary = contentType.substring(lastIndex + 1,
contentType.length());
        int pos;
        //extracting the index of file 
        pos = file.indexOf("filename=\"");
        pos = file.indexOf("\n", pos) + 1;
        pos = file.indexOf("\n", pos) + 1;
        pos = file.indexOf("\n", pos) + 1;
        int boundaryLocation = file.indexOf(boundary, pos) - 4;
        int startPos = ((file.substring(0, pos)).getBytes()).length;
        int endPos = ((file.substring(0, boundaryLocation))
.getBytes()).length;

        // creating a new file with the same name and writing the 
content in new file
        FileOutputStream fileOut = new FileOutputStream(saveFile);
        fileOut.write(dataBytes, startPos, (endPos - startPos));
        fileOut.flush();
        fileOut.close();

        %><Br><table border="2"><tr><td><b>You have successfully
 upload the file by the name of:</b>
        <% out.println(saveFile); %></td></tr></table> <%
        }
%>

回答by BalusC

This is clearly a Roseindiacode snippet. First of all, it is the worstlearning resource ever. Don't use it. It only teaches bad practices. Add that site to your blacklist. In fact, any "tutorial" site which is littered with advertisement banners and hopelessly outdated low quality code snippets are clearly maintained by amateurs with primary focus on advertisement income instead of on serious teaching. Other examples of such crap "tutorial" sites are javabeat, tutorialspoint, journaldev, javatpoint, etc. Remarkable common thing which those sites have is that they are originated in India.

这显然是一个Roseindia代码片段。首先,它是有史以来最糟糕的学习资源。不要使用它。它只教坏做法。将该站点添加到您的黑名单。事实上,任何充斥着广告横幅和过时的低质量代码片段的“教程”网站显然都是由业余爱好者维护的,主要关注广告收入而不是认真的教学。此类垃圾“教程”站点的其他示例是 javabeat、tutorialspoint、journaldev、javatpoint 等。这些站点具有的显着共同点是它们起源于印度。

Apart from the fact that you incorrectly used .htmlfile extension instead of .jsp(even though they presented their examples correctly with .jspextensions), there are several major problems with the code snippet:

除了您错误地使用.html文件扩展名而不是.jsp(即使他们正确地使用.jsp扩展名展示了他们的示例)这一事实之外,代码片段还存在几个主要问题:

  • The HTML is using '90s style uppercased tags. This is discouraged.
  • The HTML is using <font>and <center>tags which are deprecated since 1998.
  • The business logic is mingled with the presentation logic in a single JSP file. The Java code belongs in a Java class, not in a JSP file.
  • The parser is relying on Content-Lengthrequest header which is not always present per se. If this header is absent, the code breaks.
  • The parser is creating a byte array of that length. This may crash the server when the content length is larger than available server memory.
  • The parser is creating a Stringbased on the byte array using server platform default character encoding instead of the one specified in multi part header. This may malform/corrupt the result bytes.
  • The DataInputStreamwrapper is unnecessary, the code is not taking any benefit of it.
  • Etc..
  • Etc..
  • HTML 使用 90 年代风格的大写标签。这是不鼓励的。
  • HTML 正在使用<font><center>标签,这些标签自 1998 年以来已被弃用。
  • 业务逻辑与表示逻辑混合在一个 JSP 文件中。Java 代码属于 Java 类,而不属于 JSP 文件。
  • 解析器依赖于Content-Length本身并不总是存在的请求标头。如果此标头不存在,则代码会中断。
  • 解析器正在创建该长度的字节数组。当内容长度大于可用的服务器内存时,这可能会导致服务器崩溃。
  • 解析器String使用服务器平台默认字符编码而不是多部分标头中指定的字符编码基于字节数组创建一个。这可能会导致结果字节畸形/损坏。
  • DataInputStream包装是不必要的,代码没有服用任何好处。
  • 等等..
  • 等等..

It's simply terrible.

这简直太可怕了。



The right way to upload a file from JSP is to submit the form to a @MultipartConfigannotated servlet class and then use request.getPart()to get the file. You can find a snippet in this answer: How to upload files to server using JSP/Servlet?

从 JSP 上传文件的正确方法是将表单提交给带@MultipartConfig注释的 servlet 类,然后使用它request.getPart()来获取文件。您可以在这个答案中找到一个片段:如何使用 JSP/Servlet 将文件上传到服务器?

The right way to learn Java EE is elaborated in this answer: Java EE web development, where do I start and what skills do I need?

这个答案详细阐述了学习 Java EE 的正确方法:Java EE web 开发,我从哪里开始,我需要什么技能?