java 图文上传问题(不用框架或者是组件)
期望实现的功能: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--”请问大家,我应该怎样修改才能的到我想要的功能。
[解决办法]
区分图片和文字 一起传递是什么意思?
图片是一个 文字也是一个
还是一个文件包含图片和文字啊?
[解决办法]
没用过二进制。
上传图片可以用common-io, commonfileupload,里面的request封装了servlet的request,可以取到图片文件
[解决办法]
在数据库中保存图片是以二进制形式保存(你就直接保存不就行了),所有不重要的图片在数据库中保存他的地址(图片上传到服务器上)
文字直接就传递为什么要用二进制流?
[解决办法]
只能说你的思路行不通,即使你成功了,也没有哪个公司会接受,你又何必逆水行舟呢?
[解决办法]
知道原理,只要知道流的处理,
即可自己写一个上传的组件.
[解决办法]
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(); }