2015-09-28 3 views
-1

Я работаю с приложением, чтобы узнать обработкуПолучение браузера, чтобы сохранить загруженный файл

Я использую Netbeans 8.0.1 Wildfly 8, JPA и Primefaces JavaEE файл.

У меня есть только один Objet с 4 свойствами

@Id @GeneratedValue (стратегия = GenerationType.IDENTITY) частных Int id_articulo;

private String titulo; 

private String descripcion; 


@Lob 
private File archivo; 

I made a form to upload data including the file as a blob, the form call a method in a backing bean 




public void generarArticulo() throws IOException{ 


     File destFile= new File(fichero.getFileName()); 
    FileUtils.copyInputStreamToFile(fichero.getInputstream(), destFile); 

     articulo a = new articulo(); 
     a.setArchivo(destFile); 
     a.setTitulo(titulo); 
     a.setDescripcion(descripcion); 


     this.controlador.registrarArticulo(a); 

    } 

Этот метод отлично работает, запись добавлена ​​в базу данных

Тогда я и сделал DataTable, он отлично работает, и он показывает каждую запись в базе данных, а также для проверки того, что каждый файл является извлекаться я использую outputtext, что дает мне вес в байтах каждого файла, и он делает это хорошо

<p:dataTable var="articulos" value="#{listadoArticulos.listado}" 
         rows="10" 
         paginator="true" 
         > 
        <p:column headerText="Titulo" sortBy="#{articulos.titulo}" > 
     <h:outputText value="#{articulos.titulo}" /> 
    </p:column> 
    <p:column headerText="Descripcion" > 
     <h:outputText value="#{articulos.descripcion}" /> 
    </p:column> 
    [B]<p:column headerText="Fichero" > 
     <h:outputText value="#{articulos.archivo.name} y pesa #{articulos.archivo.length()}" /> 
    </p:column>[/B] 

      <p:column headerText="Descarga"> 
       <p:commandLink action="#{articuloBean.getFichero(articulos.archivo)}" value="Descargar"/> 

    </p:column>   

</p:dataTable> 

Теперь моя задача состоит в том, чтобы заставить пользователя загрузить непосредственно файл из объекта в памяти, я попробовал много вещей, но ничего не работает, .

Последнее, что я был метод GetFile (файл File), которые вы можете увидеть в приведенном выше CommandLInk, который вызывает следующий метод

public FileOutputStream getFichero (File file) throws FileNotFoundException, IOException { 

     FileInputStream in = new FileInputStream (file); 
     FileOutputStream out = new FileOutputStream("/home/alex/ficheros/"+file.getName()); 
     int c; 

     while ((c = in.read()) != -1) { 
       out.write(c); 
      } 

     return out; 

     } 

Этот метод возвращает меня из базы данных файл хранить эту и копирует его в папке/home/alex/files, я хочу, чтобы этот метод загружал нормальный файл, выделенный в свойствах файла объектов, напрямую

ЛЮБАЯ идея?

+0

Вы не можете использовать 'FileInputStream' на Blob в базе данных. Код, который вы опубликовали, не имеет ничего общего с Blobs или базами данных. Файл находится в файловой системе, а не в базе данных. Ваш вопрос не имеет смысла. – EJP

+0

Я не использую FileInputStream для загрузки BLOB Мне нужно его загрузить, оба кода работают на моем сервере :(Первый код позволяет мне зарегистрировать новую запись в моей базе данных, которая работает на 100% отлично, я просто добавляю запись, выберите файл.jpg на моем жестком диске и загрузите его отлично. Затем я смогу удалить с жесткого диска файл.jpg, перейдите в datatable, где я могу проверить все мои записи, использовать второй метод и VOILA У меня есть изображение назад в другом каталоге, я хочу, чтобы он загружал его в браузере. – Alexev

+0

Первый код просто загружает файл. Вы не показали часть, где она становится Blob, поэтому невозможно сообщить вам, как получить Blob снова, но вы утверждаете, что вторая часть кода работает отлично, так что либо вы решили эту проблему в автономном режиме, либо ее не существует. Ваш вопрос, похоже, не имеет ничего общего с Blobs или базами данных, но с тем, как заставить браузер распоряжаться содержимым в виде файла. к этому относится заголовок Content-Disposition. Вы не помогли себе, представив все это постороннее вещество и одурманив свой вопрос. – EJP

ответ

0

Я на самом деле решить дело

@WebServlet("/DownloadFileServlet") 
public class DownloadFileServlet extends HttpServlet { 

    @Inject 
    ArticuloControlador controlador; 


    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 


     String x=request.getParameter("x"); 
     int id = Integer.parseInt(x); 

     articulo a = controlador.getArticuloporID(id); 
     File f = a.getArchivo(); 

     FileInputStream inStream = new FileInputStream(f); 

     String relativePath = getServletContext().getRealPath(""); 
     System.out.println("relativePath = " + relativePath); 

     // obtengo ServletContext 
     ServletContext context = getServletContext(); 

     // obtengo MIME del fichero 
     String mimeType= URLConnection.guessContentTypeFromName(f.getName()); 

     if (mimeType == null) {   
      // steamos el MIME type si no lo encontramos 
      mimeType = "application/octet-stream"; 
     } 
     System.out.println("MIME type: " + mimeType); 

     // modificamos el response 
     response.setContentType(mimeType); 
     response.setContentLength((int) f.length()); 

     // Descargamos 
     String headerKey = "Content-Disposition"; 
     String headerValue = String.format("attachment; filename=\"%s\"", f.getName()); 
     response.setHeader(headerKey, headerValue); 


     OutputStream outStream = response.getOutputStream(); 

     byte[] buffer = new byte[4096]; 
     int bytesRead = -1; 

     while ((bytesRead = inStream.read(buffer)) != -1) { 
      outStream.write(buffer, 0, bytesRead); 
     } 

     inStream.close(); 
     outStream.close();  
    } 
} 
Смежные вопросы