Загрузка файла PDF

Я хочу загрузить файл в формате pdf с помощью приведенного ниже кода. Он предоставляет возможность просмотра, но не загружает файл. Когда я нажимаю кнопку sendfile, его отображают страницу загрузки uploadfile.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>

имя_файла - 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> <%
        }
%>

Ответы

Ответ 1

Это явно Roseindia фрагмент кода. Прежде всего, это наихудший ресурс обучения. Не используйте его. Он только учит плохим практикам. Добавьте этот сайт в свой черный список. Фактически, любой сайт "учебника", который усеян рекламными баннерами и безнадежно устаревшими низкокачественными фрагментами кода, явно поддерживается любителями, уделяя основное внимание рекламу, а не серьезному обучению. Другими примерами таких сайтов "tutorial" являются javabeat, tutorialspoint, journaldev, javatpoint и т.д. Замечательная общая вещь, которую имеют эти сайты, заключается в том, что они происходят из Индии.

Помимо того, что вы неправильно использовали расширение .html вместо .jsp (даже если они правильно отображали свои примеры с расширениями .jsp), в фрагменте кода есть несколько основных проблем:

  • HTML использует теги верхнего уровня 90-х. Это не рекомендуется.
  • HTML использует теги <font> и <center>, которые устарели с 1998 года.
  • Бизнес-логика смешивается с логикой представления в одном JSP файле. Код Java принадлежит классу Java, а не JSP файлу.
  • Парсер полагается на заголовок запроса Content-Length, который не всегда присутствует как таковой. Если этот заголовок отсутствует, код прерывается.
  • Парсер создает массив байтов этой длины. Это может привести к сбою сервера, когда длина содержимого больше доступной памяти сервера.
  • Парсер создает String на основе массива байтов, используя кодировку символов по умолчанию для серверной платформы, а не одну, указанную в заголовке нескольких частей. Это может привести к повреждению/повреждению байтов результата.
  • Оболочка DataInputStream не нужна, код не использует ее.
  • Etc..
  • Etc..

Это просто ужасно.


Правильный способ загрузки файла из JSP - отправить форму в класс @MultipartConfig аннотированных сервлетов, а затем использовать request.getPart() для получения файла. Вы можете найти фрагмент в этом ответе: Как загрузить файлы на сервер с помощью JSP/Servlet?

В этом ответе вы найдете правильный способ изучения Java EE: Java EE веб-разработка, с чего начать и какие навыки мне нужны?