Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81019
  • 博文数量: 6
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-02 17:06
文章分类

全部博文(6)

文章存档

2012年(1)

2011年(1)

2009年(4)

我的朋友

分类: Java

2009-06-23 11:42:46

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         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         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;   
    }




阅读(1038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~