期望实现的功能: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、从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--”请问大家,我应该怎样修改才能的到我想要的功能。
我想做的是一个发布框,类似微博吧,既可以发布文字信息,又可以发布图片。因为图片和文字信息是放在同一个表单中提交的,所以在servlet的时候要把二者区分开来。
这只是我个人想到的思路,如果大家可以给我提供其他思路!
这两个是不是组件哦,目前还不想用组件,多锻炼下自己的java基础嘛!
这两个是不是组件哦,目前还不想用组件,多锻炼下自己的java基础嘛!
分开对应的表单数据。
在表单中启用标记说明这个是2进行的数据。
这样
---------------------xxxxxxxxxxxxxxxxxxxx--------------
文本域=value
---------------------xxxxxxxxxxxxxxxxxxxx----------------
图片=filepath....//图片的二进制数据
asdfasdlfjal;sdjfl;ajsdl;fjalsdjflkajdfljaldfakldjfklajdflkaj
//注意从上到下都是二进制的数据,
对应的取值时进行适当的转换即可得到文本域的内容.
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);
}
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--要保存文件就自己写一个文件的流。