【问题标题】:Prevent downloaded files from replacing or overwriting each other防止下载的文件相互替换或覆盖
【发布时间】:2016-06-27 14:19:11
【问题描述】:

如何使用 Java 应用下载 MySQL 数据库中的所有文件类型并防止一个文件替换另一个文件?

如何在我的filepath=("D:\\sch work\\skirt\\filename.pdf"); 中包含所有文件类型,以便我能够使用JTable 上的 Java 鼠标单击事件从 MySQL 数据库下载 pdf、docx、jpeg 等?

我有两个问题。

  1. 虽然我想打开 docs、JPEG 和 img 文件,但我只能打开 PDF 文件。
  2. 每次我从不同的行下载另一个文件时,它都会替换现有的文件。我想保留所有这些

请在下面找到我的鼠标点击事件代码,并请建议我应该添加什么以使其在需要时工作。

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     


    String filePath =("D:\\sch work\\skirt\\filename.pdf");
      int BUFFER_SIZE = 4096;

      try {
    int cert_code= jTable1.getSelectedRow();
    String tableClick=(jTable1.getModel().getValueAt(cert_code,3).toString());

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/employee_certificate","root","");
         String sql= "SELECT cert FROM certificate WHERE cert_code =?" ;
             PreparedStatement pstmt =  con.prepareStatement(sql);

  pstmt.setString(1, tableClick); 
  ResultSet rs=pstmt.executeQuery();
if(rs.next()){
        Blob blob = rs.getBlob("cert");  
        InputStream inputStream = blob.getBinaryStream();
            OutputStream outputStream = new FileOutputStream(filePath);

            int bytesRead = -1;
            byte[] buffer = new byte[BUFFER_SIZE];
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
           inputStream.close();
            outputStream.close();
             //JOptionPane.showMessageDialog(null,"file saved")
} }
  catch (Exception e)
    {JOptionPane.showMessageDialog(null,e);}  
}                                    

【问题讨论】:

    标签: java mysql swing


    【解决方案1】:

    如果您需要 PDF 以外的内容,则应存储该证书 blob 中的内容,以便发送适当的文件名/类型:

    您会得到 PDF,因为这是您写出的确切+唯一文件类型:

    String filePath =("D:\\sch work\\skirt\\filename.pdf");
                                                     ^^^
    

    也许更像(伪代码):

    select cert,filename,filetype from ...
    filepath = 'd:\sch work\skirt' + filename
    header('Content-type: ' + filetype);
    

    【讨论】:

    • 嗨 Marc B。数据库包含图像 pdf 和 docs.all 存储为 blob。由于很难分辨哪个文件是 pdf 哪个不是,我想在文件路径中包含所有内容,以便我可以使用适当的扩展名保存文件。
    • 那么您需要使用 blob 存储额外的数据以识别 blob 中的内容,正如我在上面显示的那样。 blob 只是“二进制大对象”。你往里面塞的东西就是后来又出来的东西。由您决定为该二进制数据提供意义。去“哦,这是一个pdf”或“哦,这是一个jpeg”不是数据库的工作。它的工作是去“哦,这是一些我无法以任何方式修改的随机二进制垃圾集合”。
    • 但我认为这意味着每种文件类型都有不同的鼠标单击事件。我想将所有这些事件都包含在一个鼠标单击事件中。
    • 如果您的数据库中有 pdf,那么有一个“jpg”按钮会有什么好处?
    • 确实不需要,这就是为什么我需要在我的路径文件中添加一些东西。我已经删除了数据库中的所有文件并添加了新文件,但问题仍然存在......我不知道是什么添加到我的文件路径以捕获所有文件类型,这样每次我下载任何文件时都不必更改文件路径的内容。
    【解决方案2】:

    这是我的答案。上帝保佑 Marc B。

    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {

          int BUFFER_SIZE = 4096;
    
          try {
        int cert_code= jTable1.getSelectedRow();
        String tableClick=(jTable1.getModel().getValueAt(cert_code,3).toString());
    
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/employee_certificate","root","");
             String sql= "SELECT cert, cert_name FROM certificate WHERE cert_code =?" ;
                 PreparedStatement pstmt =  con.prepareStatement(sql);
    
      pstmt.setString(1, tableClick);
      ResultSet rs=pstmt.executeQuery();
    if(rs.next()){
         String filename = rs.getString("cert_name");
        Blob blob = rs.getBlob("cert"); 
            InputStream inputStream = blob.getBinaryStream();   
                String filePath ="D:\\sch work\\skirt\\"+filename;
                OutputStream outputStream = new FileOutputStream(filePath);
    
                int bytesRead = -1;
                byte[] buffer = new byte[BUFFER_SIZE];
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
               inputStream.close();
                outputStream.close();
                 //JOptionPane.showMessageDialog(null,"file saved")
    } }
      catch (Exception e)
        {JOptionPane.showMessageDialog(null,e);}  
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-03
      • 1970-01-01
      • 2020-03-13
      • 2010-12-05
      • 2015-08-26
      • 2014-05-26
      • 1970-01-01
      • 2011-01-19
      • 2017-05-09
      相关资源
      最近更新 更多