首页编程java编程java传照片为什么被限制?java传参数字符串的大小限制

java传照片为什么被限制?java传参数字符串的大小限制

编程之家2023-10-1389次浏览

很多朋友对于java传照片为什么被限制和java传参数字符串的大小限制不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

java传照片为什么被限制?java传参数字符串的大小限制

java TCP传输数据有没有大小限制,有,是多少,没有,为什么

MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。

PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

java传照片为什么被限制?java传参数字符串的大小限制

为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入),因为以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的.

PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。

UDP包的大小就应该是 1492- IP头(20)- UDP头(8)= 1464(BYTES)

java传照片为什么被限制?java传参数字符串的大小限制

TCP包的大小就应该是 1492- IP头(20)- TCP头(20)= 1452(BYTES)

目前大多数的路由设备的MTU都为1500

我对上面的理解是:如果我们定义的TCP和UDP包小于1452,1464,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误。如果使用UDP协议,如果IP层组包发生错误,那么包就会被丢弃,UDP不保证可靠传输。但是TCP发生组包错误时,该包会被重传,保证可靠传输。所以,我们在用Socket编程时,包的大小设定不一定非要小于1400,UDP协议要求包小于64K,TCP没有限定

java 上传文件 问题

是通过数据流上传吗?利用 B\S架构还是 C\S架构?

jsp文件上传大多采用采用开源项目来简化处理,这里列出常用的两个jar包的实现,并进行比较,说明他们的优缺点和应该注意的问题。

Commons FileUpload,可以在http://jakarta.apache.org/commons/fileupload/下载,这个包需要Commons IO的支持,可以在http://jakarta.apache.org/commons/io/下载

com.oreilly.servlet,可以在http://www.servlets.com/cos/下载

Commons FileUpload提供三种文件上传处理方式,DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式,其中DiskFileUpload已经在javadoc下已经被标记为过期的方法,建议用ServletFileUpload代替,而PortletFileUpload需要配合portlet-api来使用,所以这里我们只介绍ServletFileUpload,并且这个也是最常用的。

com.oreilly.servlet也提供了三种文件上传的处理方式,MultipartWrapper、MultipartRequest和MultipartParser三种方式,其中MultipartWrapper和MultipartRequest的用法基本相同,并且没有MultipartRequest提供的操作多,所以这里介绍MultipartRequest,MultipartParser和前两者有些不同,可以用来处理某些特殊情况,例如表单中有两个同名的文件上传选择框。

我们暂时称三面三种文件上传方式分别为:ServletFileUpload方式(MultipartTestServlet)、MultipartRequest方式(MultipartTestServlet2)、MultipartParser方式(MultipartTestServlet3)

代码如下:

test.html

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%>

<html>

<body>

<form action="MultipartTestServlet" enctype="multipart/form-data" method="post">

<input type="text" name="username"/><br/>

<input type="file" name="myfile"/><br/>

<input type="file" name="myfile"/><br/>

<input type="submit"/>

</form>

<br/><br/><br/><br/>

<form action="MultipartTestServlet2" enctype="multipart/form-data" method="post">

<input type="text" name="username"/><br/>

<input type="file" name="myfile"/><br/>

<input type="file" name="myfile"/><br/>

<input type="submit"/>

</form>

<br/><br/><br/><br/>

<form action="MultipartTestServlet3" enctype="multipart/form-data" method="post">

<input type="text" name="username"/><br/>

<input type="file" name="myfile"/><br/>

<input type="file" name="myfile"/><br/>

<input type="submit"/>

</form>

</body>

</html>

MultipartTestServlet.java

package com.bug.servlet;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUpload;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.RequestContext;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.fileupload.servlet.ServletRequestContext;

public class MultipartTestServlet extends HttpServlet{

public MultipartTestServlet(){

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

request.setCharacterEncoding("gbk");

RequestContext requestContext= new ServletRequestContext(request);

if(FileUpload.isMultipartContent(requestContext)){

DiskFileItemFactory factory= new DiskFileItemFactory();

factory.setRepository(new File("c:/tmp/"));

ServletFileUpload upload= new ServletFileUpload(factory);

//upload.setHeaderEncoding("gbk");

upload.setSizeMax(2000000);

List items= new ArrayList();

try{

items= upload.parseRequest(request);

} catch(FileUploadException e1){

System.out.println("文件上传发生错误"+ e1.getMessage());

}

Iterator it= items.iterator();

while(it.hasNext()){

FileItem fileItem=(FileItem) it.next();

if(fileItem.isFormField()){

System.out.println(fileItem.getFieldName()+""+ fileItem.getName()+""+ new String(fileItem.getString().getBytes("iso8859-1"),"gbk"));

}else{

System.out.println(fileItem.getFieldName()+""+

fileItem.getName()+""+

fileItem.isInMemory()+""+

fileItem.getContentType()+""+

fileItem.getSize());

if(fileItem.getName()!=null&& fileItem.getSize()!=0){

File fullFile= new File(fileItem.getName());

File newFile= new File("c:/temp/"+ fullFile.getName());

try{

fileItem.write(newFile);

} catch(Exception e){

e.printStackTrace();

}

}else{

System.out.println("文件没有选择或文件内容为空");

}

}

}

}

}

}

MultipartTestServlet2.java

package com.bug.servlet;

import java.io.IOException;

import java.util.Enumeration;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;

import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class MultipartTestServlet2 extends HttpServlet{

public MultipartTestServlet2(){

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

//request.setCharacterEncoding("gbk");不起作用

System.out.println("start");

MultipartRequest multi= new MultipartRequest(request,"c:/tmp/", 2*1024*1024,"gbk", new DefaultFileRenamePolicy());

System.out.println("start");

Enumeration filesName= multi.getFileNames();

Enumeration paramsName= multi.getParameterNames();

while(paramsName.hasMoreElements()){

String paramName=(String) paramsName.nextElement();

System.out.println(multi.getParameter(paramName));

}

while(filesName.hasMoreElements()){

String fileName=(String) filesName.nextElement();

System.out.println(multi.getFilesystemName(fileName)+""+

multi.getOriginalFileName(fileName)+""+

multi.getContentType(fileName)+"");

if(multi.getFilesystemName(fileName)!=null&&!multi.getFilesystemName(fileName).equals(""))

System.out.println(multi.getFile(fileName).toURI());

}

}

}

MultipartTestServlet3.java

package com.bug.servlet;

import java.io.File;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.multipart.FilePart;

import com.oreilly.servlet.multipart.MultipartParser;

import com.oreilly.servlet.multipart.ParamPart;

import com.oreilly.servlet.multipart.Part;

public class MultipartTestServlet3 extends HttpServlet{

public MultipartTestServlet3(){

super();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

MultipartParser mp= new MultipartParser(request, 2*1024*1024, false, false,"gbk");

Part part;

while((part= mp.readNextPart())!= null){

String name= part.getName();

if(part.isParam()){

ParamPart paramPart=(ParamPart) part;

String value= paramPart.getStringValue();

System.out.println("param: name="+ name+"; value="+ value);

}

else if(part.isFile()){

// it's a file part

FilePart filePart=(FilePart) part;

String fileName= filePart.getFileName();

if(fileName!= null){

long size= filePart.writeTo(new File("c:/tmp/"));

System.out.println("file: name="+ name+"; fileName="+ fileName+

", filePath="+ filePart.getFilePath()+

", contentType="+ filePart.getContentType()+

", size="+ size);

}

else{

System.out.println("file: name="+ name+"; EMPTY");

}

System.out.flush();

}

}

}

}

web.xml中加入

<servlet>

<servlet-name>MultipartTestServlet</servlet-name>

<servlet-class>com.bug.servlet.MultipartTestServlet</servlet-class>

</servlet>

<servlet>

<servlet-name>MultipartTestServlet2</servlet-name>

<servlet-class>com.bug.servlet.MultipartTestServlet2</servlet-class>

</servlet>

<servlet>

<servlet-name>MultipartTestServlet3</servlet-name>

<servlet-class>com.bug.servlet.MultipartTestServlet3</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>MultipartTestServlet</servlet-name>

<url-pattern>/MultipartTestServlet</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>MultipartTestServlet2</servlet-name>

<url-pattern>/MultipartTestServlet2</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>MultipartTestServlet3</servlet-name>

<url-pattern>/MultipartTestServlet3</url-pattern>

</servlet-mapping>

问题1、中文问题:

三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题,包括初始化的时候传入gbk作为参数,或是是初始化后通过setEncoding的方式来实现。

另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现,而其它两种方式不支持这种方式。

问题2、文件大小限制

ServletFileUpload方式可以设置文件大小限制,也可以不用设置,例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1),表明不限制上传的大小。文档中没有指明默认的限制的多少,我在不设置的情况下上传了一个9M的东西,可以上传,估计默认是不限制大小的。

而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的,如果不设置,默认是1M的大小限制。

问题3、文件上传发生错误

如果文件上传过程中发生任何错误,或者是文件的大小超出了范围,系统都将抛出错误。

ServletFileUpload方式在upload.parseRequest(request)时抛出错误

MultipartRequest方式在new MultipartRequest(。。。)时抛出错误

MultipartParser方式在new MultipartParser(。。。)时抛出错误

问题4、上传同名文件时,他们保存到临时目录是的冲突问题

ServletFileUpload方式,不会有冲突,系统会把上传得文件按照一定的规则重新命名,保证不会冲突

MultipartParser方式,会产生冲突,系统会把文件按照上传时的文件名,保存到临时目录下,如果两个用会同时上传文件名相同的文件,那么就可能会产生冲突,一方把另一方的临时文件给替换了。

MultipartRequest方式,在初始化时如果提供了一个名称转换策略,就不会有冲突,如果不提桶,就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。

问题5:表单中有两个同名的文件上传选择框,就像我们例子中的myfile一样,每个表单中有两个name=“myfile”的上传框

ServletFileUpload方式,可以处理,可以分别得到他们各自的文件,

MultipartRequest方式,不可以处理,会发生冲突,会有一个上传框的文件覆盖了另外一个。

MultipartParser方式,可以处理,可以分别得到他们各自的文件,

备注:

代码比较乱,主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。

java传参数字符串的大小限制

String类型底层存储是采用char[]数组的,所以说char[]数组的大小就决定了String对象的大小.由于数组的下标采用int类型,因此最大能存放的元素个数只有2147483648个,这个数也就是2G.所以说char[]数组能存储2G大小的字符.因此在理想情况下也就是内存无限大,堆可以无限大的情况下,一个String类型的极限大小就是4G,长度为2147483648个字符

好了,文章到此结束,希望可以帮助到大家。

java为什么没有fork(Java和C + +有什么区别)金戈铁马出自 金戈铁马出自哪首诗