Chinaunix

标题: jspsmartupload上传相片到MySQL数据库问题 [打印本页]

作者: shao_sml    时间: 2009-06-23 11:42
标题: jspsmartupload上传相片到MySQL数据库问题
jspsmartupload上传相片到MySQL数据库问题
    在jspsmartupload的示例中,第四个示例是把文件上传到MySQL数据库的tfiles表的FILE字段中.但发现不成功,试着上传一个图片文件,发现图片的最后部分没上传(少了一截).
追踪过程:
1.sample4.jsp中,调用fileToField()方法进行文件上传到数据库中:
    mySmartUpload.getFiles().getFile(0).fileToField(rs,"FILE");
2.分析fileToField()方法:
public void fileToField(ResultSet rs, String columnName)
    throws SQLException, com.jspsmart.upload.SmartUploadException, IOException, ServletException
  {
    long numBlocks = -7962811221516746752L;
    int blockSize = 65536;//块大小
    int leftOver = 0;//剩余的部分
    int pos = 0;
    if (rs == null) throw new IllegalArgumentException("The RecordSet cannot be null (1145).");
    if (columnName == null) throw new IllegalArgumentException("The columnName cannot be null (1150).");
    if (columnName.length() == 0) { throw new IllegalArgumentException("The columnName cannot be empty (1155).");
    }
    numBlocks = BigInteger.valueOf(this.m_size).divide(BigInteger.valueOf(blockSize)).longValue(); //计算块数
    leftOver = BigInteger.valueOf(this.m_size).mod(BigInteger.valueOf(blockSize)).intValue();//计算剩余的部分(不够一块)
    try
    {
      for (int i = 1; i <numBlocks; ++i) {
        rs.updateBinaryStream(columnName, new ByteArrayInputStream(this.m_parent.m_binArray, pos, blockSize), blockSize);
        pos = (pos == 0) ? 1 : pos;
        pos = i * blockSize;
      }
      if (leftOver <= 0) return;
      rs.updateBinaryStream(columnName, new ByteArrayInputStream(this.m_parent.m_binArray, pos, leftOver), leftOver);
    }
    catch (SQLException e)
    {
      byte[] binByte2 = new byte[this.m_size];
      System.arraycopy(this.m_parent.m_binArray, this.m_startData, binByte2, 0, this.m_size);
      rs.updateBytes(columnName, binByte2);
    }
    catch (Exception e) {
      throw new com.jspsmart.upload.SmartUploadException("Unable to save file in the DataBase (1130).");
    }
  }
此程序是以分块的方式进行上传.
其中:
    for (int i = 1; i <numBlocks; ++i) {
        rs.updateBinaryStream(columnName, new ByteArrayInputStream(this.m_parent.m_binArray, pos, blockSize), blockSize);
        pos = (pos == 0) ? 1 : pos;
        pos = i * blockSize;
    }
    应该有错,改为:
    for (int i = 1; i <=numBlocks; ++i) {
        rs.updateBinaryStream(columnName, new ByteArrayInputStream(this.m_parent.m_binArray, pos, blockSize), blockSize);
    pos = i * blockSize;
        pos = (pos == 0) ? 0 : pos;   
    }
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23460/showart_1974129.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2