期望实现的功能:jsp表单中一起传递图片和文字到servlet,servlet得到传递的值后保存到数据库中。先帮忙看下思路,这样可以吗:
   1、从jsp页面传递图文的二进制码给servlet。
   2、在servlet中获得jsp中传递过来的值。
   3、区分是图片的二进制码和文字的二进制码。
   4、分别将二进制码转换为对应的格式(文字是字符,请问图片是什么尼?)。
   5、将文字保存到数据库中,图片保存到硬盘中,把图片路径保存在数据库中。目前实现的代码如下:1、jsp代码:<form action="homeS" method="post" enctype="multipart/form-data">
  
  <textarea tabindex="1" name="Memo" rows="4" cols="70" class="qs" id="sq"></textarea>
  <br/><br/>
 
  <!-- 显示当前数输入的字符个数 -->
   <label id="nub" >140</label>
  
   <div class="hlinput"><input  type="submit" class="formbutton" title="按Ctrl+Enter键发送消息" value=""/></div>
   <div class="hlload"><input title="上传图片,最大2MB" class="sl-input-file" type="file" name="picture" id="upload-file"/></div>
   </form>2、servlet代码如下(homeS):package com.d41741.servlet;import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;import javax.resource.cci.Streamable;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class homeS extends HttpServlet { public homeS() {
super();
} public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}

private String[] sourceFile = new String[255]; //源文件名  private String[] suffix = new String[255]; //文件后缀名  private String canSuffix = ".gif.jpg.jpeg.png.rar.txt"; //可上传的文件后缀名  private String objectPath = "F:\\'program files (x86)\\'MyEclipseWorkspace\\'FanFouImg/"; //目标文件目录  private String[] objectFileName = new String[255]; //目标文件名  private ServletInputStream sis = null; //输入流  private String[] description = new String[255]; //描述状态  private long size = 100 * 1024; //限制大小  private int count = 0; //已传输文件数目  private byte[] b = new byte[5102]; //字节流存放数组  private boolean successful = true;  private Hashtable fields = new Hashtable();  //设置上传文件的后缀名  public void setSuffix(String canSuffix) {  this.canSuffix = canSuffix;  } 

//设置文件保存路径  public void setObjectPath(String objectPath) {  this.objectPath = objectPath;  } 

//设置文件保存路径  public void setSize(long maxSize) {  this.size = maxSize;  }  public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

// 获得homeLeft.jsp中,传递过来的信息
// 获得传递过来的值之后要将图片的流和文字的流区分开,并转换为字符和图片
try{
// 得到表单传递过来的值(二进制)
sis  = request.getInputStream(); 

// 将得到的二进制转换为字符
int a = 0; 
int k = 0; 
String s = " "; 

while ( (a = sis.readLine(b, 0, b.length)) != -1) {  s = new String(b, 0, a);  if ( (k = s.indexOf("filename=/'")) != -1) {  // 取得文件数据  s = s.substring(k + 10);  k = s.indexOf("/'");  s = s.substring(0, k);  sourceFile[count] = s;  k = s.lastIndexOf(".");  suffix[count] = s.substring(k + 1);  ++count;  } else if ( (k = s.indexOf("name=/'")) != -1) { 
String fieldName = s.substring(k+6, s.length()-3);  sis.readLine(b, 0, b.length);  StringBuffer fieldValue = new StringBuffer(b.length);  while ( (a = sis.readLine(b, 0, b.length)) != -1) {  s = new String(b, 0, a-2);  if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {  break;  } else {  fieldValue.append(s);  }  }  fields.put(fieldName, fieldValue.toString());  }  if (!successful)  break;  } 

//      临时测试,获取的二进制被转换了没有!
System.out.println(s);

}catch (Exception e) {

}finally{

}

out.flush();
out.close();
} }在我的项目中运行之后,这边的到的值全部都是类似“------------xHfPCjJsT7Kx0IjZhUS7Qp--”请问大家,我应该怎样修改才能的到我想要的功能。

解决方案 »

  1.   

    没用过二进制。上传图片可以用common-io, commonfileupload,里面的request封装了servlet的request,可以取到图片文件
      

  2.   


    我想做的是一个发布框,类似微博吧,既可以发布文字信息,又可以发布图片。因为图片和文字信息是放在同一个表单中提交的,所以在servlet的时候要把二者区分开来。
      这只是我个人想到的思路,如果大家可以给我提供其他思路!
      

  3.   


    这两个是不是组件哦,目前还不想用组件,多锻炼下自己的java基础嘛!
      

  4.   


    这两个是不是组件哦,目前还不想用组件,多锻炼下自己的java基础嘛!
      

  5.   

    其实原理不难,只是用--------------------标记串------------------------
    分开对应的表单数据。
    在表单中启用标记说明这个是2进行的数据。
    这样
    ---------------------xxxxxxxxxxxxxxxxxxxx--------------
    文本域=value
    ---------------------xxxxxxxxxxxxxxxxxxxx----------------
    图片=filepath....//图片的二进制数据
    asdfasdlfjal;sdjfl;ajsdl;fjalsdjflkajdfljaldfakldjfklajdflkaj
    //注意从上到下都是二进制的数据,
    对应的取值时进行适当的转换即可得到文本域的内容.
      

  6.   

    //  得到表单传递过来的值(二进制)
    sis = request.getInputStream();  
    你直接将表单的传送过来的流进行显示即可.
    还有,这东西是包着协议的,不可能扔个串就过来.
    int length=-1;
    byte[] bs=new byte[4096];
    while((length=sis.read(bs,0,4096)!=-1){
    out.print(new String(bs,0,length);
    }
      

  7.   

    同学 你完全理解错了 图片可以从流中得到 文字嘛直接用request.getPa.......获取就是啦 没这么复杂 还要区分什么是图片什么是文字
      

  8.   

    大文件只需存disk路径即可,你的思路是对的
      

  9.   

    servlet 代码:
    try{
    InputStream is = request.getInputStream();
    byte[] b = new byte[10240];
    int iRead = is.read(b, 0, 10240);
    while(iRead!=-1){
    System.out.print(new String(b,0,iRead));
    iRead = is.read(b, 0, 10240);
    }
    }catch(Throwable t){
    t.printStackTrace();
    }JSP代码:
    <form action="servlet/TestServlet" method="post" enctype="multipart/form-data">
         <input type="file" name="uploadfile"/><br/>
         <input type="hidden" name="aaa" value="111"/><br/>
         <input type="submit" value="submit"/>
        </form>servlet打印结果:
    -----------------------------7dc8a82a03a8
    Content-Disposition: form-data; name="uploadfile"; filename="C:\Users\ivan\Desktop\blank.gif"
    Content-Type: image/gifGIF89aXXXX---这里都是一堆乱码----
    -----------------------------7dc8a82a03a8
    Content-Disposition: form-data; name="aaa"111
    -----------------------------7dc8a82a03a8--要保存文件就自己写一个文件的流。
      

  10.   

    感谢哈,我想是我没有表达清楚。我的from是 enctype="multipart/form-data"