跪求一个java 上传图片到服务器的工具类
/
文件上传处理主程序。
@return int 操作结果 0 文件操作成功;1 request对象不存在。 2 没有设定文件保存路径或者文件保存路径不正确;3
没有设定正确的enctype;4 文件操作异常。
/
public Map<String, String> fileupload_java(HttpServletRequest request,String uploadpath) {
Map<String, String> param = new HashMap<String, String>();
try {
// 参数或者文件名
String name = null;
// 参数的value
String value = null;
// 读取的流是否为文件的标志位
boolean fileFlag = false;
// 要存储的文件。
File tmpFile = null;
// 上传的文件的名字
String fName = null;
FileOutputStream baos = null;
BufferedOutputStream bos = null;
int rtnPos = 0;
byte[] buffs = new byte[BUFSIZE 8];
// 取得ContentType
String contentType = requestgetContentType();
int index = contentTypeindexOf("boundary=");
String boundary = "--" + contentTypesubstring(index + 9);
String endBoundary = boundary + "--";
// 从request对象中取得流。
ServletInputStream sis = requestgetInputStream();
// 读取1行
while ((rtnPos = sisreadLine(buffs, 0, buffslength)) != -1) {
String strBuff = new String(buffs, 0, rtnPos);
if (strBuffstartsWith(boundary)) {
if (name != null && nametrim()length() > 0) {
if (fileFlag) {
bosflush();
baosclose();
bosclose();
baos = null;
bos = null;
paramput(name, tmpFilegetAbsolutePath());
} else {
String paramValue = paramget(name);
paramValue += ","+ value;
paramput(name, paramValue);
}
}
name = new String();
value = new String();
fileFlag = false;
fName = new String();
rtnPos = sisreadLine(buffs, 0, buffslength);
if (rtnPos != -1) {
strBuff = new String(buffs, 0, rtnPos);
if (strBufftoLowerCase()startsWith("content-disposition: form-data; ")) {
int nIndex = strBufftoLowerCase()indexOf("name=\"");
int nLastIndex = strBufftoLowerCase()indexOf("\"", nIndex + 6);
name = strBuffsubstring(nIndex + 6, nLastIndex);
}
int fIndex = strBufftoLowerCase()indexOf("filename=\"");
if (fIndex != -1) {
fileFlag = true;
int fLastIndex = strBufftoLowerCase()indexOf("\"", fIndex + 10);
// fName = strBuffsubstring(fIndex + 10, fLastIndex);
fName = new String(strBuffsubstring(fIndex + 10, fLastIndex)getBytes(),"gbk");
fName = FileLgetFileNameWithoutSeprater(fName);
if (fName == null || fNametrim()length() == 0) {
fileFlag = false;
sisreadLine(buffs, 0, buffslength);
sisreadLine(buffs, 0, buffslength);
sisreadLine(buffs, 0, buffslength);
continue;
}else{
fName = FileLgetFileNameTime(fName);
sisreadLine(buffs, 0, buffslength);
sisreadLine(buffs, 0, buffslength);
}
}
}
} else if (strBuffstartsWith(endBoundary)) {
if (name != null && nametrim()length() > 0) {
if (fileFlag) {
bosflush();
baosclose();
bosclose();
baos = null;
bos = null;
paramput(name, tmpFilegetAbsolutePath());
} else {
String paramValue = paramget(name);
paramValue += ","+ value;
paramput(name, paramValue);
}
}
} else {
if (fileFlag) {
if (baos == null && bos == null) {
tmpFile = new File(uploadpath + fName);
baos = new FileOutputStream(tmpFile);
bos = new BufferedOutputStream(baos);
}
boswrite(buffs, 0, rtnPos);
baosflush();
} else {
value = value + strBuff;
}
}
}
} catch (IOException e) {
eprintStackTrace();
}
return param;
}
服务器端源码:
import javaioBufferedReader;
import javaioFile;
import javaioFileNotFoundException;
import javaioFileOutputStream;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javanetServerSocket;
import javanetSocket;
/
文件名:ServerReceivejava
实现功能:作为服务器接收客户端发送的文件
具体实现过程:
1、建立SocketServer,等待客户端的连接
2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据
其中保存客户端要发送的文件名和文件大小信息
3、根据文件名在本地创建文件,并建立好流通信
4、循环接收数据包,将数据包写入文件
5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件
6、文件接收工作结束
public class ServerReceive {
public static void main(String[] args) {
/与服务器建立连接的通信句柄/
ServerSocket ss = null;
Socket s = null;
/定义用于在接收后在本地创建的文件对象和文件输出流对象/
File file = null;
FileOutputStream fos = null;
/定义输入流,使用socket的inputStream对数据包进行输入/
InputStream is = null;
/定义byte数组来作为数据包的存储数据包/
byte[] buffer = new byte[4096 5];
/用来接收文件发送请求的字符串/
String comm = null;
/建立socekt通信,等待服务器进行连接/
try {
ss = new ServerSocket(4004);
s = ssaccept();
} catch (IOException e) {
eprintStackTrace();
}
/读取一行客户端发送过来的约定信息/
try {
InputStreamReader isr = new InputStreamReader(sgetInputStream());
BufferedReader br = new BufferedReader(isr);
comm = brreadLine();
} catch (IOException e) {
Systemoutprintln("服务器与客户端断开连接");
}
/开始解析客户端发送过来的请求命令/
int index = commindexOf("/#");
/判断协议是否为发送文件的协议/
String xieyi = commsubstring(0, index);
if(!xieyiequals("111")){
Systemoutprintln("服务器收到的协议码不正确");
return;
}
/解析出文件的名字和大小/
comm = commsubstring(index + 2);
index = commindexOf("/#");
String filename = commsubstring(0, index)trim();
String filesize = commsubstring(index + 2)trim();
/创建空文件,用来进行接收文件/
file = new File(filename);
if(!fileexists()){
try {
filecreateNewFile();
} catch (IOException e) {
Systemoutprintln("服务器端创建文件失败");
}
}else{
/在此也可以询问是否覆盖/
Systemoutprintln("本路径已存在相同文件,进行覆盖");
}
/以上就是客户端代码中写到的服务器的准备部分/
/
服务器接收文件的关键代码/
try {
/将文件包装到文件输出流对象中/
fos = new FileOutputStream(file);
long file_size = LongparseLong(filesize);
is = sgetInputStream();
/size为每次接收数据包的长度/
int size = 0;
/count用来记录已接收到文件的长度/
long count = 0;
/使用while循环接收数据包/
while(count < file_size){
/从输入流中读取一个数据包/
size = isread(buffer);
/将刚刚读取的数据包写到本地文件中去/
foswrite(buffer, 0, size);
fosflush();
/将已接收到文件的长度+size/
count += size;
Systemoutprintln("服务器端接收到数据包,大小为" + size);
}
} catch (FileNotFoundException e) {
Systemoutprintln("服务器写文件失败");
} catch (IOException e) {
Systemoutprintln("服务器:客户端断开连接");
}finally{
/
将打开的文件关闭
如有需要,也可以在此关闭socket连接
/
try {
if(fos != null)
fosclose();
} catch (IOException e) {
eprintStackTrace();
}//catch (IOException e)
}//finally
}//public static void main(String[] args)
}//public class ServerReceive
客户端源码:
import javaioFile;
import javaioFileInputStream;
import javaioFileNotFoundException;
import javaioIOException;
import javaioOutputStream;
import javaioPrintStream;
import javanetSocket;
/
文件名:ClientSendjava
实现功能:作为客户端向服务器发送一个文件
具体实现过程:
1、建立与服务器端的连接,IP:127001, port:4004
2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器
3、循环读取本地文件,将文件打包发送到数据输出流中
4、关闭文件,结束传输
/
public class ClientSend {
public static void main(String[] args) {
/与服务器建立连接的通信句柄/
Socket s = null;
/定义文件对象,即为要发送的文件
如果使用绝对路径,不要忘记使用'/'和'\'的区别
具体区别,请读者自行查询
/
File sendfile = new File("APICHM");
/定义文件输入流,用来打开、读取即将要发送的文件/
FileInputStream fis = null;
/定义byte数组来作为数据包的存储数据包/
byte[] buffer = new byte[4096 5];
/定义输出流,使用socket的outputStream对数据包进行输出/
OutputStream os = null;
/检查要发送的文件是否存在/
if(!sendfileexists()){
Systemoutprintln("客户端:要发送的文件不存在");
return;
}
/与服务器建立连接/
try {
s = new Socket("127001", 4004);
}catch (IOException e) {
Systemoutprintln("未连接到服务器");
}
/用文件对象初始化fis对象
以便于可以提取出文件的大小
/
try {
fis = new FileInputStream(sendfile);
} catch (FileNotFoundException e1) {
e1printStackTrace();
}
/首先先向服务器发送关于文件的信息,以便于服务器进行接收的相关准备工作
具体的准备工作,请查看服务器代码。
发送的内容包括:发送文件协议码(此处为111)/#文件名(带后缀名)/#文件大小
/
try {
PrintStream ps = new PrintStream(sgetOutputStream());
psprintln("111/#" + sendfilegetName() + "/#" + fisavailable());
psflush();
} catch (IOException e) {
Systemoutprintln("服务器连接中断");
}
/
此处睡眠2s,等待服务器把相关的工作准备好
也是为了保证网络的延迟
读者可自行选择添加此代码
/
try {
Threadsleep(2000);
} catch (InterruptedException e1) {
e1printStackTrace();
}
/之前的准备工作结束之后
下面就是文件传输的关键代码
/
try {
/获取socket的OutputStream,以便向其中写入数据包/
os = sgetOutputStream();
/ size 用来记录每次读取文件的大小/
int size = 0;
/使用while循环读取文件,直到文件读取结束/
while((size = fisread(buffer)) != -1){
Systemoutprintln("客户端发送数据包,大小为" + size);
/向输出流中写入刚刚读到的数据包/
oswrite(buffer, 0, size);
/刷新一下/
osflush();
}
} catch (FileNotFoundException e) {
Systemoutprintln("客户端读取文件出错");
} catch (IOException e) {
Systemoutprintln("客户端输出文件出错");
}finally{
/
将打开的文件关闭
如有需要,也可以在此关闭socket连接
/
try {
if(fis != null)
fisclose();
} catch (IOException e) {
Systemoutprintln("客户端文件关闭出错");
}//catch (IOException e)
}//finally
}//public static void main(String[] args)
}//public class ClientSend
这里你弄错了一个问题;\x0d\你的程序是要传递的二进制数据\x0d\而不是传递路径,然后再到服务器读取文件数据(你的服务器有这个文件)\x0d\只有当你的服务器下有这个文件了,你传递一个路径,读取是可以的\x0d\//---\x0d\关于如何上传文件, 自己google一下,很多教程
如果你的JAVA部署的tomcat,就是你要查找文件的服务器,那就用:
File file = new File("文件路径")。
如果你本地的JAVA想要访问远程的一个服务器的文件是否存在,就得用如下方法:
URL url = new URL(“文件路径:可以是本地服务器的路径,也可以是远程服务器的路径”)
HttpURLConnection urlcon = (HttpURLConnection) urlopenConnection();
//message = urlcongetHeaderField(0);
//文件存在‘HTTP/11 200 OK’ 文件不存在 ‘HTTP/11 404 Not Found’
Long TotalSize=LongparseLong(urlcongetHeaderField("Content-Length"));
if (TotalSize>0){
return true;
}else{
return false;
}
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
0条评论