2016-08-05 22 views
0

Ich erlaube dem Benutzer, Dateien auf imgur Hosting hochzuladen und einen Link zurück zu bekommen. Alles scheint richtig zu funktionieren. Allerdings verwende ichImage Upload (Dateipfad) - JSP

String itemName = item.getName();

Es funktioniert perfekt im Internet Explorer und dem Browser von Eclipse. Bei Firefox und Chrome ist dies jedoch nicht der Fall, da aufgrund der Browsersicherheit nur der Dateiname im Eingabefeld abgerufen wird. Was ist der Workaround, um es zum Laufen zu bringen?

Mein Code: -

private void processlist(HttpServletRequest request, 
    HttpServletResponse response) { 
     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     if (!isMultipart) { 
     } else { 
      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      List items = null; 
      try { 
       items = upload.parseRequest(request); 
      } catch (FileUploadException e) { 
       e.printStackTrace(); 
      } 
      Iterator itr = items.iterator(); 
      while (itr.hasNext()) { 
       FileItem item = (FileItem) itr.next(); 
       if (item.isFormField()) { 
       } else { 
        try { 
         String itemName = item.getName(); 


         BufferedImage img = null; 
         try { 
          img = ImageIO.read(new File(itemName)); 
         } catch (IOException e) { 
         } 

         String IMGUR_POST_URI = "https://api.imgur.com/3/upload"; 
         String IMGUR_API_KEY = "mykeyyyyyyyyyyyy"; 
         String projectname = ""; 
         try { 
          ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
          System.out.println("Writing image..."); 
          ImageIO.write(img, "png", baos); 
          URL url = new URL(IMGUR_POST_URI); 

          System.out.println("Encoding..."); 
          String data = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder 
            .encode(Base64.encodeBase64String(baos.toByteArray()).toString(), "UTF-8"); 
          data += "&" + URLEncoder.encode("key", "UTF-8") + "=" 
            + URLEncoder.encode(IMGUR_API_KEY, "UTF-8"); 

          System.out.println("Connecting..."); 
          URLConnection conn = url.openConnection(); 
          conn.setDoOutput(true); 
          conn.setDoInput(true); 
          conn.setRequestProperty("Authorization", "Client-ID " + IMGUR_API_KEY); 
          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

          OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

          System.out.println("Sending data..."); 
          wr.write(data); 
          wr.flush(); 

          System.out.println("Finished."); 

          // just display the raw response 
          BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
          String line; 
          while ((line = in.readLine()) != null) { 
           JSONObject jObject = new JSONObject(line); 
           JSONObject data1 = jObject.getJSONObject("data"); 
           projectname = data1.getString("link"); 
           if (flagAccessed == false) { 
            img1 = projectname; 
           } else { 
            img2 = projectname; 
           } 
           System.out.print(projectname); 

Meine JSP-Code ist eine einfache Form: -

<form action="UploadServlet" method="post" enctype="multipart/form-data" name="form1" id="form1" style="text-align:center;display:inline;"> 
<table border="1" style="text-align:center;"> 
         <td><center> 
           Select image1: <input name="file" type="file" id="file" class="btn btn-dark btn-lg12"> 
          </center></td> 
        </tr> 

        <tr> 
         <td><center> 
           Select image2: <input name="file" type="file" id="file" class="btn btn-dark btn-lg12"> 
          </center></td> 
        </tr> 
        <tr> 
         <td align="center" style="margin-top: 5px;"></td> 
        </tr> 

       </table> 


      <br> 
      <br> 
      <input type="submit" name="Submit" value="Submit files" class="btn btn-dark btn-lg"/> 

      </form> 
+0

Ich möchte sicherstellen, dass ich Ihre Frage verstehe. Willst du damit sagen, dass 'Items' eine Liste von FileItem-Objekten sind und in Firefox/Chrome eine Liste von Strings? Oder dass die Dateiinhalte in diesen Browsern nicht hochgeladen werden? – LAROmega

+0

@LAROmega: In IE ist die Zeichenfolge itemName = item.getName(); returns ... "C: \ Pfad \ Dateiname.jpg" ... Kurz gesagt, was ich versuche zu sagen ist, dass es den richtigen Dateipfad zurückgibt. Also funktioniert mein Code. In Firefox und Chrome, String itemName = item.getName(); Es gibt nur Dateinamen wie Dateiname.jpg zurück, daher mein img = null, wenn ich versuche, es an imgur zu senden. – starry

+0

Ich würde sagen, IE ist derjenige, der hier schlecht ist. Es gibt keinen Grund, dass der Server den vollständigen Pfad zu der Datei auf dem Client kennen muss. Aber die Lösung sollte einfach sein. 'if (item.getName()! = null && item.getName(). enthält (" \\/")' dann parse es, ansonsten benutze nur item.getName(). edit: Ich bin nicht 100% wenn du muss dem Schrägstrich entkommen oder nicht – LAROmega

Antwort

0

das Update Zusammengefasst: img = ImageIO.read(new File(itemName)); Ändern img = ImageIO.read(item.getInputStream()); zu verwenden, kann der Server einen Inputstream von zuzugreifen das Bild. Obwohl Internet Explorer einen vollständigen Dateipfad im Namen des FileItems bereitstellt, funktioniert dies nur in Umgebungen, in denen sich die Datei sowohl auf dem Server als auch auf dem Client befindet, z. B. in einer Entwicklungsumgebung.