- 浏览: 419931 次
- 性别:
- 来自: 厦门
-
文章分类
- 全部博客 (202)
- Oracle (35)
- MsSQL (10)
- MySQL (8)
- Jsp (7)
- Java 基础 (21)
- 零星点缀 (20)
- PowerDesigner (3)
- dotNet (5)
- Hibernate (8)
- 搜索技术 (3)
- Linux (18)
- jQuery (4)
- POI/excel/word (2)
- javascript (6)
- PHP (4)
- JSTL (3)
- winows 操作系统 (6)
- HTML基础 (2)
- 网络兼职 (3)
- spring (7)
- 人生 (2)
- 网络协议之Http (3)
- JDBC (1)
- FSO(FileSystemObject)技术 (3)
- css样式 (1)
- EnterpriseDb (2)
- VMware (1)
- Android (1)
- 数据转换工具=》 (1)
- Oracle-->statspack (2)
- Oracle==>性能 (1)
- Greenplum (1)
- 库的转换 (1)
- DOS (1)
最新评论
-
青春的、脚步:
xingmei_ok 写道解密失败。。。。原始:aMD5后:0 ...
java的MD5加密、解密 -
xingmei_ok:
New_Mao_Er 写道看着标题我就蛋疼了,md5 是一个摘 ...
java的MD5加密、解密 -
New_Mao_Er:
看着标题我就蛋疼了,md5 是一个摘要算法,是无法解密的,如果 ...
java的MD5加密、解密 -
xingmei_ok:
解密失败。。。。
原始:a
MD5后:0cc175b9c0f ...
java的MD5加密、解密 -
yinxueyuan122:
[b][/b][size=xx-small][/siz ...
java的MD5加密、解密
以前用过SWFUpload ,功能确实很强大。javaeye上有人发布了这样一篇文章step- by-step多文件WEB批量上传(swfupload)的完美解决方案 有兴趣的朋友可以看一下。Leeo觉得SWFUpload稍微不足的就是界面的定制,总感觉自己定制出来的界面有点难登大雅之堂。下面Leeo为大家介绍一下,如何使用FlashFileUpload这个Flash组件来实现多文件上传,并且通过java程序自动生成缩略图和添加水印,FlashFileUpload定制出来的界面还是挺漂亮的(PS:这个界面是Leeo从 UUShare上弄下来的,^_^),先来Show一张效果图:
从上面的图片从可以看出中间有个水印(PS:本博客的Logo),这并不是用Photoshop之类的软件弄上去的,而是通过下面将要讲到的java程序自动添加的,效果很不错,(*^__^*) 嘻嘻……好,正式开始吧…
第一步:当然是获取flashfileupload.swf这个Flash组件啦,大家可以从这里下载 ,或者其他什么途径得到都行
第二步:编写上传页面的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String uploadType = (String)request.getParameter("uploadType"
);
Long filmid = Long.parseLong((String)request.getParameter("filmid"
));
//out.print(uploadType);
//out.print(filmid);
%>
<
object
id
="fileUpload"
codebase
="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version=10,0,22,87"
height
="310"
width
="500"
align
="middle"
classid
="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
>
<
param
name
="_cx"
value
="13229"
/>
<
param
name
="_cy"
value
="8202"
/>
<%
if
("Video"
.equals(uploadType)){
%>
<
param
name
="flashvars"
value
="fileTypeDescription=允许视频格式&fileTypes=*.asx;*.asf;*.mpg;*.wmv;*.3gp;*.mp4;*.mov;*.avi;*.flv;*.wmv9;*.rm;*.rmvb&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
/>
<%
}else
{
%>
<
param
name
="flashvars"
value
="fileTypeDescription=JPG格式图片&fileTypes=*.jpg;*.jpeg&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
/>
<%
}
%>
<
param
name
="movie"
value
="flashfileupload.swf?ver=20090520"
/>
<
param
name
="src"
value
="flashfileupload.swf?ver=20090520"
/>
<
param
name
="wmode"
value
="transparent"
/>
<
param
name
="play"
value
="0"
/>
<
param
name
="loop"
value
="-1"
/>
<
param
name
="quality"
value
="high"
/>
<
param
name
="salign"
value
="lt"
/>
<
param
name
="menu"
value
="-1"
/>
<
param
name
="base"
value
=""
/>
<
param
name
="allowscriptaccess"
value
="sameDomain"
/>
<
param
name
="scale"
value
="noscale"
/>
<
param
name
="devicefont"
value
="0"
/>
<
param
name
="embedmovie"
value
="0"
/>
<
param
name
="bgcolor"
value
=""
/>
<
param
name
="swremote"
value
=""
/>
<
param
name
="moviedata"
value
=""
/>
<
param
name
="seamlesstabbing"
value
="1"
/>
<
param
name
="profile"
value
="0"
/>
<
param
name
="profileaddress"
value
=""
/>
<
param
name
="profileport"
value
="0"
/>
<
param
name
="allownetworking"
value
="all"
/>
<
param
name
="allowfullscreen"
value
="true"
/>
<%
if
("Video"
.equals(uploadType)){
%>
<
embed
src
="flashfileupload.swf?ver=20090520"
flashvars
="fileTypeDescription=允许视频格式&fileTypes=*.asx;*.asf;*.mpg;*.wmv;*.3gp;*.mp4;*.mov;*.avi;*.flv;*.wmv9;*.rm;*.rmvb&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
quality
="high"
wmode
="transparent"
width
="500"
height
="310"
name
="fileUpload"
align
="middle"
allowscriptaccess
="samedomain"
type
="application/x-shockwave-flash"
pluginspage
="http://www.macromedia.com/go/getflashplayer"
>
</
embed
>
<%
}else
{
%>
<
embed
src
="flashfileupload.swf?ver=20090520"
flashvars
="fileTypeDescription=JPG格式图片&fileTypes=*.jpg;*.jpeg&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
quality
="high"
wmode
="transparent"
width
="500"
height
="310"
name
="fileUpload"
align
="middle"
allowscriptaccess
="samedomain"
type
="application/x-shockwave-flash"
pluginspage
="http://www.macromedia.com/go/getflashplayer"
>
</
embed
>
<%
}
%>
</
object
>
说明:其中主要的是flashvars 这个参数的设置(PS:Leeo本人对这里的设置也仅仅是略知一二)
fileTypeDescription:允许上传文件的类型描述
fileTypes:允许上传的文件类型
completeFunction:上传完成后调用的js函数
fileSizeLimit:文件大小限制
totalUploadSize:一次性上传文件总大小限制
accounttype:这个没搞清楚怎么用,如果哪位知道的请告知一声,谢谢…
uploadPage:上传文件的请求路径,跟在它后面的是一些用户附加的数据。其中网上有网友说可以;jsessionid=的形式传递 session,Leeo没有做测试。?uploadType=是程序中需要的一些附加数据,这里本来需要两个变量的,之所以把它写到一个变量里,然后用 “-”隔开两个变量值,就像代码中的<%=uploadType %>-<%=filmid %>,是因为我们知道通常通过url传参是用“&”号隔开的,但这里却不能这么做,因为整个flashvars 就是用“&”来隔开不同参数的,如果附加的数据也用“&”隔开就会被截断,得不到我们想要的数据,所以这里用一种比较马虎的解决方法,利用 “-”号把不同变量值连接起来,然后在服务器端的java代码中用split("-")再把它们分割开来
第三步:配置struts.xml文件,如下:
<
package
name
="ajaxfileupload"
namespace
="/"
extends
="ajaxfileupload-default"
>
<
action
name
="flashupload"
class
="leeo.action.FlashfileuploadAction"
>
<
result
name
="success"
type
="httpheader"
>
<
param
name
="status"
>
200</
param
>
</
result
>
</
action
>
</
package
>
特别说明: 这里还用到了ajax-file-upload-plugin- 0.4.0.jar(PS:Struts2中用ajxa方式上传文件需要的jar包)
第四步:编写action类代码,如下:
/** 文件对象 */
private
transient
File[] Filedata;
/** 文件名 */
/** 文件对象 */
private
transient
File[] Filedata;
/** 文件名 */
private
transient
String[] FiledataFileName;
/** 文件内容类型 */
private
transient
String[] FiledataContentType;
/**
* 区分是上传海报、剧照、片花
* **/
private
transient
String uploadType;
public
String Upload() throws
Exception {
System.out.println("FiledataFileName length:
" + FiledataFileName.length);
System.out.println("uploadType:
" + uploadType);
String[] type_filmid = uploadType.split("-
");
System.out.println("filmid:
" + type_filmid[1]);
Film f = filmService.findFilmById(new
Long(type_filmid[1]));
//原文件存放路径
String OriginalImageDirectory = ServletActionContext.getServletContext().getRealPath("/UploadFile/
" + type_filmid[0] + "/OriginalImage
") + System.getProperty("file.separator
", "\\
");
for
(int
i = 0; i < Filedata.length; i ++){
System.out.println("Filedata[
"+i+"]:
" + Filedata[i]);
System.out.println("FiledataFileName[
"+i+"]:
" + FiledataFileName[i]);
System.out.println("FiledataContentType[
"+i+"]:
" + FiledataContentType[i]);
//在指定目录创建文件
String newname = FileUpload.getFileName(FiledataFileName[i]);
File bigFile = new
File(OriginalImageDirectory, newname);
//把要上传的文件copy过去
FileUpload.copy(Filedata[i], bigFile);
if
(!"Video
".equals(type_filmid[0])){
//缩略图存放路径
String ThumbnailsDirectory = ServletActionContext.getServletContext().getRealPath("/UploadFile/
" + type_filmid[0] + "/Thumbnails
") + System.getProperty("file.separator
", "\\
");
//生成缩略图
FileUpload.scaleImage(OriginalImageDirectory + newname, ThumbnailsDirectory + newname, 180, 200);
//设置数据库海报字段路径
String waterImgFile = ServletActionContext.getServletContext().getRealPath("/UploadFile
") + System.getProperty("file.separator
", "\\
");
// 给大图添加文字水印
//FileUpload.watermark(bigFile);
// 给大图添加图片水印,可以是gif或png格式
FileUpload.imageWaterMark(bigFile, waterImgFile);
File smallFile = new
File(ThumbnailsDirectory, newname);
// 给大图添加文字水印
//FileUpload.watermark(smallFile);
// 给大图添加图片水印,可以是gif或png格式
FileUpload.imageWaterMark(smallFile, waterImgFile);
}
/*
* 操作数据库部分
* */
if
("Poster
".equals(type_filmid[0])){
f.setFPoster(newname);
filmService.modFilm(f);
}else
if
("Still
".equals(type_filmid[0])){
FilmStill fs = new
FilmStill();
fs.setFsPath(newname);
fs.setFilm(f);
filmService.addFilmStill(fs);
}else
if
("Video
".equals(type_filmid[0])){
FilmVideo fv = new
FilmVideo();
fv.setFvPath(newname);
fv.setFilm(f);
filmService.addFilmVideo(fv);
}
}
return
SUCCESS;
}
public
File[] getFiledata() {
return
Filedata;
}
public
void
setFiledata(File[] filedata) {
this
.Filedata = filedata;
}
public
String[] getFiledataFileName() {
return
FiledataFileName;
}
public
void
setFiledataFileName(String[] filedataFileName) {
this
.FiledataFileName = filedataFileName;
}
public
String[] getFiledataContentType() {
return
FiledataContentType;
}
public
void
setFiledataContentType(String[] filedataContentType) {
this
.FiledataContentType = filedataContentType;
}
public
String getUploadType() {
return
uploadType;
}
public
void
setUploadType(String uploadType) {
this
.uploadType = uploadType;
}其中,操作数据库部分的代码跟这个例子无关,可以省去。
第五步:要用到的其他类的代码(PS:这部分代码来自互联网)
1:FileUpload.java用于生成缩略图、添加水印、生成无重复的文件名
import
java.awt.AlphaComposite;
import
java.awt.Color;
import
java.awt.Font;
import
java.awt.Graphics2D;
import
java.awt.Image;
import
java.awt.image.BufferedImage;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
javax.imageio.ImageIO;
import
com.sun.image.codec.jpeg.JPEGCodec;
import
com.sun.image.codec.jpeg.JPEGImageEncoder;
public
class
FileUpload {
private
static
final
int
BUFFER_SIZE = 16 * 1024;
private
static
final
String WATER_TEXT = "文字水印
";
private
static
final
String WATER_IMG_NAME = "logo.png
";
/*生成无重复文件名*/
public
static
String getFileName(String name){
SimpleDateFormat df =new
SimpleDateFormat("yyyyMMddHHmmss
");
Date date = new
Date();
String filename=null
;
if
(!"".equals(name) && name != null
){
filename=df.format(date) + RandomNum.random2() + name.substring(name.lastIndexOf(".
"), name.length());
}
System.out.println("filename is:
"+filename);
return
filename;
}
/*上传文件*/
public
static
void
copy(File src, File dst) {
try
{
InputStream in = null
;
OutputStream out = null
;
try
{
in = new
BufferedInputStream(new
FileInputStream(src), BUFFER_SIZE);
out = new
BufferedOutputStream(new
FileOutputStream(dst), BUFFER_SIZE);
byte
[] buffer = new
byte
[BUFFER_SIZE];
while
(in.read(buffer) > 0) {
out.write(buffer);
}
} finally
{
if
(null
!= in) {
in.close();
}
if
(null
!= out) {
out.close();
}
}
} catch
(Exception e) {
e.printStackTrace();
}
}
/*生成缩略图*/
public
static
String scaleImage(String fromFileStr, String saveToFileStr, int
formatWideth, int
formatHeight) throws
Exception {
ScaleImage is = new
ScaleImage();
try
{
is.saveImageAsJpg(fromFileStr, saveToFileStr, formatWideth, formatHeight);
}catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"error
";
}
return
"ok
";
}
/**
* 添加文字水印
*
* @return
* @throws Exception
* @throws Exception
*/
public
static
void
watermark(File img) throws
Exception {
System.out.println("[watermark file name]--
" + img.getPath());
try
{
if
(!img.exists()) {
throw
new
IllegalArgumentException("file not found!
");
}
System.out.println("[watermark][img]--
" + img);
// 创建一个FileInputStream对象从源图片获取数据流
FileInputStream sFile = new
FileInputStream(img);
// 创建一个Image对象并以源图片数据流填充
Image src = ImageIO.read(sFile);
// 得到源图宽
int
width = src.getWidth(null
);
// 得到源图长
int
height = src.getHeight(null
);
// 创建一个BufferedImage来作为图像操作容器
BufferedImage image = new
BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 创建一个绘图环境来进行绘制图象
Graphics2D g = image.createGraphics();
// 将原图像数据流载入这个BufferedImage
System.out.println("width:
" + width + " height:
" + height);
g.drawImage(src, 0, 0, width, height, null
);
// 设定文本字体
g.setFont(new
Font("宋体
", Font.BOLD, 28));
String rand = WATER_TEXT;
// 设定文本颜色
g.setColor(Color.blue);
// 设置透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
// 向BufferedImage写入文本字符,水印在图片上的坐标
g.drawString(rand, width - (width - 20), height - (height - 60));
// 使更改生效
g.dispose();
// 创建输出文件流
FileOutputStream outi = new
FileOutputStream(img);
// 创建JPEG编码对象
JPEGImageEncoder encodera = JPEGCodec.createJPEGEncoder(outi);
// 对这个BufferedImage (image)进行JPEG编码
encodera.encode(image);
// 关闭输出文件流
outi.close();
sFile.close();
} catch
(IOException e) {
e.printStackTrace();
throw
new
Exception(e);
}
}
/**
* 添加图片水印
*
*/
public
static
void
imageWaterMark(File imgFile, String waterFilePath) throws
Exception {
try
{
// 目标文件
Image src = ImageIO.read(imgFile);
int
wideth = src.getWidth(null
);
int
height = src.getHeight(null
);
BufferedImage image = new
BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, wideth, height, null
);
// 水印文件 路径
String waterImgPath = waterFilePath + WATER_IMG_NAME;
System.out.println("waterImgPath--
" + waterImgPath);
File waterFile = new
File(waterImgPath);
Image waterImg = ImageIO.read(waterFile);
int
w_wideth = waterImg.getWidth(null
);
int
w_height = waterImg.getHeight(null
);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
g.drawImage(waterImg, (wideth - w_wideth) / 2, (height - w_height) / 2, w_wideth, w_height, null
);
// 水印文件结束
g.dispose();
FileOutputStream out = new
FileOutputStream(imgFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} catch
(Exception e) {
e.printStackTrace();
}
}
} 2:RandomNum.java用于生成无重复随机数
import
java.util.Random;
public
class
RandomNum {
public
static
int
[] random1() {
Random r = new
Random();
int
temp1, temp2;
int
send[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
int
len = send.length;
int
returnValue[] = new
int
[22];
for
(int
i = 0; i < 22; i++) {
temp1 = Math.abs(r.nextInt()) % len;
returnValue[i] = send[temp1];
temp2 = send[temp1];
send[temp1] = send[len - 1];
send[len - 1] = temp2;
len--;
}
return
returnValue;
}
public
static
int
[] random2() {
int
send[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
int
temp1, temp2, temp3;
Random r = new
Random();
for
(int
i = 0; i < send.length; i++){// 随机交换send.length次
temp1 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生一个位置
temp2 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生另一个位置
if
(temp1 != temp2) {
temp3 = send[temp1];
send[temp1] = send[temp2];
send[temp2] = temp3;
}
}
return
send;
}
} 到此,本应用实例的代码就完成了,赶紧体验一下吧。。。
來源:http://itlife365.com/?post=216
从上面的图片从可以看出中间有个水印(PS:本博客的Logo),这并不是用Photoshop之类的软件弄上去的,而是通过下面将要讲到的java程序自动添加的,效果很不错,(*^__^*) 嘻嘻……好,正式开始吧…
第一步:当然是获取flashfileupload.swf这个Flash组件啦,大家可以从这里下载 ,或者其他什么途径得到都行
第二步:编写上传页面的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String uploadType = (String)request.getParameter("uploadType"
);
Long filmid = Long.parseLong((String)request.getParameter("filmid"
));
//out.print(uploadType);
//out.print(filmid);
%>
<
object
id
="fileUpload"
codebase
="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version=10,0,22,87"
height
="310"
width
="500"
align
="middle"
classid
="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
>
<
param
name
="_cx"
value
="13229"
/>
<
param
name
="_cy"
value
="8202"
/>
<%
if
("Video"
.equals(uploadType)){
%>
<
param
name
="flashvars"
value
="fileTypeDescription=允许视频格式&fileTypes=*.asx;*.asf;*.mpg;*.wmv;*.3gp;*.mp4;*.mov;*.avi;*.flv;*.wmv9;*.rm;*.rmvb&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
/>
<%
}else
{
%>
<
param
name
="flashvars"
value
="fileTypeDescription=JPG格式图片&fileTypes=*.jpg;*.jpeg&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
/>
<%
}
%>
<
param
name
="movie"
value
="flashfileupload.swf?ver=20090520"
/>
<
param
name
="src"
value
="flashfileupload.swf?ver=20090520"
/>
<
param
name
="wmode"
value
="transparent"
/>
<
param
name
="play"
value
="0"
/>
<
param
name
="loop"
value
="-1"
/>
<
param
name
="quality"
value
="high"
/>
<
param
name
="salign"
value
="lt"
/>
<
param
name
="menu"
value
="-1"
/>
<
param
name
="base"
value
=""
/>
<
param
name
="allowscriptaccess"
value
="sameDomain"
/>
<
param
name
="scale"
value
="noscale"
/>
<
param
name
="devicefont"
value
="0"
/>
<
param
name
="embedmovie"
value
="0"
/>
<
param
name
="bgcolor"
value
=""
/>
<
param
name
="swremote"
value
=""
/>
<
param
name
="moviedata"
value
=""
/>
<
param
name
="seamlesstabbing"
value
="1"
/>
<
param
name
="profile"
value
="0"
/>
<
param
name
="profileaddress"
value
=""
/>
<
param
name
="profileport"
value
="0"
/>
<
param
name
="allownetworking"
value
="all"
/>
<
param
name
="allowfullscreen"
value
="true"
/>
<%
if
("Video"
.equals(uploadType)){
%>
<
embed
src
="flashfileupload.swf?ver=20090520"
flashvars
="fileTypeDescription=允许视频格式&fileTypes=*.asx;*.asf;*.mpg;*.wmv;*.3gp;*.mp4;*.mov;*.avi;*.flv;*.wmv9;*.rm;*.rmvb&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
quality
="high"
wmode
="transparent"
width
="500"
height
="310"
name
="fileUpload"
align
="middle"
allowscriptaccess
="samedomain"
type
="application/x-shockwave-flash"
pluginspage
="http://www.macromedia.com/go/getflashplayer"
>
</
embed
>
<%
}else
{
%>
<
embed
src
="flashfileupload.swf?ver=20090520"
flashvars
="fileTypeDescription=JPG格式图片&fileTypes=*.jpg;*.jpeg&completeFunction=UploadComplete()&fileSizeLimit=3000000&totalUploadSize=10240000&accounttype=0&uploadPage=flashupload!Upload.action;jsessionid=${session.id}?uploadType=<%=uploadType %>-<%=filmid %>"
quality
="high"
wmode
="transparent"
width
="500"
height
="310"
name
="fileUpload"
align
="middle"
allowscriptaccess
="samedomain"
type
="application/x-shockwave-flash"
pluginspage
="http://www.macromedia.com/go/getflashplayer"
>
</
embed
>
<%
}
%>
</
object
>
说明:其中主要的是flashvars 这个参数的设置(PS:Leeo本人对这里的设置也仅仅是略知一二)
fileTypeDescription:允许上传文件的类型描述
fileTypes:允许上传的文件类型
completeFunction:上传完成后调用的js函数
fileSizeLimit:文件大小限制
totalUploadSize:一次性上传文件总大小限制
accounttype:这个没搞清楚怎么用,如果哪位知道的请告知一声,谢谢…
uploadPage:上传文件的请求路径,跟在它后面的是一些用户附加的数据。其中网上有网友说可以;jsessionid=的形式传递 session,Leeo没有做测试。?uploadType=是程序中需要的一些附加数据,这里本来需要两个变量的,之所以把它写到一个变量里,然后用 “-”隔开两个变量值,就像代码中的<%=uploadType %>-<%=filmid %>,是因为我们知道通常通过url传参是用“&”号隔开的,但这里却不能这么做,因为整个flashvars 就是用“&”来隔开不同参数的,如果附加的数据也用“&”隔开就会被截断,得不到我们想要的数据,所以这里用一种比较马虎的解决方法,利用 “-”号把不同变量值连接起来,然后在服务器端的java代码中用split("-")再把它们分割开来
第三步:配置struts.xml文件,如下:
<
package
name
="ajaxfileupload"
namespace
="/"
extends
="ajaxfileupload-default"
>
<
action
name
="flashupload"
class
="leeo.action.FlashfileuploadAction"
>
<
result
name
="success"
type
="httpheader"
>
<
param
name
="status"
>
200</
param
>
</
result
>
</
action
>
</
package
>
特别说明: 这里还用到了ajax-file-upload-plugin- 0.4.0.jar(PS:Struts2中用ajxa方式上传文件需要的jar包)
第四步:编写action类代码,如下:
/** 文件对象 */
private
transient
File[] Filedata;
/** 文件名 */
/** 文件对象 */
private
transient
File[] Filedata;
/** 文件名 */
private
transient
String[] FiledataFileName;
/** 文件内容类型 */
private
transient
String[] FiledataContentType;
/**
* 区分是上传海报、剧照、片花
* **/
private
transient
String uploadType;
public
String Upload() throws
Exception {
System.out.println("FiledataFileName length:
" + FiledataFileName.length);
System.out.println("uploadType:
" + uploadType);
String[] type_filmid = uploadType.split("-
");
System.out.println("filmid:
" + type_filmid[1]);
Film f = filmService.findFilmById(new
Long(type_filmid[1]));
//原文件存放路径
String OriginalImageDirectory = ServletActionContext.getServletContext().getRealPath("/UploadFile/
" + type_filmid[0] + "/OriginalImage
") + System.getProperty("file.separator
", "\\
");
for
(int
i = 0; i < Filedata.length; i ++){
System.out.println("Filedata[
"+i+"]:
" + Filedata[i]);
System.out.println("FiledataFileName[
"+i+"]:
" + FiledataFileName[i]);
System.out.println("FiledataContentType[
"+i+"]:
" + FiledataContentType[i]);
//在指定目录创建文件
String newname = FileUpload.getFileName(FiledataFileName[i]);
File bigFile = new
File(OriginalImageDirectory, newname);
//把要上传的文件copy过去
FileUpload.copy(Filedata[i], bigFile);
if
(!"Video
".equals(type_filmid[0])){
//缩略图存放路径
String ThumbnailsDirectory = ServletActionContext.getServletContext().getRealPath("/UploadFile/
" + type_filmid[0] + "/Thumbnails
") + System.getProperty("file.separator
", "\\
");
//生成缩略图
FileUpload.scaleImage(OriginalImageDirectory + newname, ThumbnailsDirectory + newname, 180, 200);
//设置数据库海报字段路径
String waterImgFile = ServletActionContext.getServletContext().getRealPath("/UploadFile
") + System.getProperty("file.separator
", "\\
");
// 给大图添加文字水印
//FileUpload.watermark(bigFile);
// 给大图添加图片水印,可以是gif或png格式
FileUpload.imageWaterMark(bigFile, waterImgFile);
File smallFile = new
File(ThumbnailsDirectory, newname);
// 给大图添加文字水印
//FileUpload.watermark(smallFile);
// 给大图添加图片水印,可以是gif或png格式
FileUpload.imageWaterMark(smallFile, waterImgFile);
}
/*
* 操作数据库部分
* */
if
("Poster
".equals(type_filmid[0])){
f.setFPoster(newname);
filmService.modFilm(f);
}else
if
("Still
".equals(type_filmid[0])){
FilmStill fs = new
FilmStill();
fs.setFsPath(newname);
fs.setFilm(f);
filmService.addFilmStill(fs);
}else
if
("Video
".equals(type_filmid[0])){
FilmVideo fv = new
FilmVideo();
fv.setFvPath(newname);
fv.setFilm(f);
filmService.addFilmVideo(fv);
}
}
return
SUCCESS;
}
public
File[] getFiledata() {
return
Filedata;
}
public
void
setFiledata(File[] filedata) {
this
.Filedata = filedata;
}
public
String[] getFiledataFileName() {
return
FiledataFileName;
}
public
void
setFiledataFileName(String[] filedataFileName) {
this
.FiledataFileName = filedataFileName;
}
public
String[] getFiledataContentType() {
return
FiledataContentType;
}
public
void
setFiledataContentType(String[] filedataContentType) {
this
.FiledataContentType = filedataContentType;
}
public
String getUploadType() {
return
uploadType;
}
public
void
setUploadType(String uploadType) {
this
.uploadType = uploadType;
}其中,操作数据库部分的代码跟这个例子无关,可以省去。
第五步:要用到的其他类的代码(PS:这部分代码来自互联网)
1:FileUpload.java用于生成缩略图、添加水印、生成无重复的文件名
import
java.awt.AlphaComposite;
import
java.awt.Color;
import
java.awt.Font;
import
java.awt.Graphics2D;
import
java.awt.Image;
import
java.awt.image.BufferedImage;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
javax.imageio.ImageIO;
import
com.sun.image.codec.jpeg.JPEGCodec;
import
com.sun.image.codec.jpeg.JPEGImageEncoder;
public
class
FileUpload {
private
static
final
int
BUFFER_SIZE = 16 * 1024;
private
static
final
String WATER_TEXT = "文字水印
";
private
static
final
String WATER_IMG_NAME = "logo.png
";
/*生成无重复文件名*/
public
static
String getFileName(String name){
SimpleDateFormat df =new
SimpleDateFormat("yyyyMMddHHmmss
");
Date date = new
Date();
String filename=null
;
if
(!"".equals(name) && name != null
){
filename=df.format(date) + RandomNum.random2() + name.substring(name.lastIndexOf(".
"), name.length());
}
System.out.println("filename is:
"+filename);
return
filename;
}
/*上传文件*/
public
static
void
copy(File src, File dst) {
try
{
InputStream in = null
;
OutputStream out = null
;
try
{
in = new
BufferedInputStream(new
FileInputStream(src), BUFFER_SIZE);
out = new
BufferedOutputStream(new
FileOutputStream(dst), BUFFER_SIZE);
byte
[] buffer = new
byte
[BUFFER_SIZE];
while
(in.read(buffer) > 0) {
out.write(buffer);
}
} finally
{
if
(null
!= in) {
in.close();
}
if
(null
!= out) {
out.close();
}
}
} catch
(Exception e) {
e.printStackTrace();
}
}
/*生成缩略图*/
public
static
String scaleImage(String fromFileStr, String saveToFileStr, int
formatWideth, int
formatHeight) throws
Exception {
ScaleImage is = new
ScaleImage();
try
{
is.saveImageAsJpg(fromFileStr, saveToFileStr, formatWideth, formatHeight);
}catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"error
";
}
return
"ok
";
}
/**
* 添加文字水印
*
* @return
* @throws Exception
* @throws Exception
*/
public
static
void
watermark(File img) throws
Exception {
System.out.println("[watermark file name]--
" + img.getPath());
try
{
if
(!img.exists()) {
throw
new
IllegalArgumentException("file not found!
");
}
System.out.println("[watermark][img]--
" + img);
// 创建一个FileInputStream对象从源图片获取数据流
FileInputStream sFile = new
FileInputStream(img);
// 创建一个Image对象并以源图片数据流填充
Image src = ImageIO.read(sFile);
// 得到源图宽
int
width = src.getWidth(null
);
// 得到源图长
int
height = src.getHeight(null
);
// 创建一个BufferedImage来作为图像操作容器
BufferedImage image = new
BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 创建一个绘图环境来进行绘制图象
Graphics2D g = image.createGraphics();
// 将原图像数据流载入这个BufferedImage
System.out.println("width:
" + width + " height:
" + height);
g.drawImage(src, 0, 0, width, height, null
);
// 设定文本字体
g.setFont(new
Font("宋体
", Font.BOLD, 28));
String rand = WATER_TEXT;
// 设定文本颜色
g.setColor(Color.blue);
// 设置透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
// 向BufferedImage写入文本字符,水印在图片上的坐标
g.drawString(rand, width - (width - 20), height - (height - 60));
// 使更改生效
g.dispose();
// 创建输出文件流
FileOutputStream outi = new
FileOutputStream(img);
// 创建JPEG编码对象
JPEGImageEncoder encodera = JPEGCodec.createJPEGEncoder(outi);
// 对这个BufferedImage (image)进行JPEG编码
encodera.encode(image);
// 关闭输出文件流
outi.close();
sFile.close();
} catch
(IOException e) {
e.printStackTrace();
throw
new
Exception(e);
}
}
/**
* 添加图片水印
*
*/
public
static
void
imageWaterMark(File imgFile, String waterFilePath) throws
Exception {
try
{
// 目标文件
Image src = ImageIO.read(imgFile);
int
wideth = src.getWidth(null
);
int
height = src.getHeight(null
);
BufferedImage image = new
BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, wideth, height, null
);
// 水印文件 路径
String waterImgPath = waterFilePath + WATER_IMG_NAME;
System.out.println("waterImgPath--
" + waterImgPath);
File waterFile = new
File(waterImgPath);
Image waterImg = ImageIO.read(waterFile);
int
w_wideth = waterImg.getWidth(null
);
int
w_height = waterImg.getHeight(null
);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
g.drawImage(waterImg, (wideth - w_wideth) / 2, (height - w_height) / 2, w_wideth, w_height, null
);
// 水印文件结束
g.dispose();
FileOutputStream out = new
FileOutputStream(imgFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} catch
(Exception e) {
e.printStackTrace();
}
}
} 2:RandomNum.java用于生成无重复随机数
import
java.util.Random;
public
class
RandomNum {
public
static
int
[] random1() {
Random r = new
Random();
int
temp1, temp2;
int
send[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
int
len = send.length;
int
returnValue[] = new
int
[22];
for
(int
i = 0; i < 22; i++) {
temp1 = Math.abs(r.nextInt()) % len;
returnValue[i] = send[temp1];
temp2 = send[temp1];
send[temp1] = send[len - 1];
send[len - 1] = temp2;
len--;
}
return
returnValue;
}
public
static
int
[] random2() {
int
send[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
int
temp1, temp2, temp3;
Random r = new
Random();
for
(int
i = 0; i < send.length; i++){// 随机交换send.length次
temp1 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生一个位置
temp2 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生另一个位置
if
(temp1 != temp2) {
temp3 = send[temp1];
send[temp1] = send[temp2];
send[temp2] = temp3;
}
}
return
send;
}
} 到此,本应用实例的代码就完成了,赶紧体验一下吧。。。
來源:http://itlife365.com/?post=216
发表评论
-
密码强度检测(收藏)
2010-11-15 17:16 1403密码强度提示是最近流行的一个功能,但是99%的案例都忽略了检测 ... -
文字居右对齐比较
2010-05-11 17:49 1226<tr><td colspan =" ... -
tomcat集群和负载均衡的实现(在同一台 简单记录)
2010-03-10 17:09 1076tomcat集群和负载均衡的实现(在同一台 简单记录) 查看 ... -
session功能实现原理(转载)
2010-03-10 12:56 933HTTP协议(http://www.w3.org/Protoc ... -
eshopcms 开源下载地址
2010-01-24 20:34 2070eshopcms 开源下载地址: http://code.go ... -
Struts,Hibernate,Spring整合的重点在于配置文件
2010-01-05 09:33 1595本人在写作开发者突击和《高手真经——Java Web核心框架》 ...
相关推荐
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战。
【window 可视化nvm管理node版本 nvm-desktop】
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
# 基于microbit编程语言的mymicrobit扩展插件项目 ## 项目简介 这是一个基于microbit编程语言的mymicrobit扩展插件项目。该项目旨在提供额外的功能和特性,以扩展microbit编程环境。通过此插件,用户可以轻松地在MakeCode环境中进行编程,实现对micro:bit设备的更多控制和功能实现。 ## 项目的主要特性和功能 1. 扩展性提供了丰富的积木块和代码库,允许用户轻松实现复杂的编程逻辑和功能扩展。 2. 图形化编程支持通过积木块形式的图形化编程,降低编程门槛,方便初学者快速上手。 3. 实时预览提供了积木块的实时预览功能,方便用户直观地了解代码块的逻辑和功能。 4. 与MakeCode无缝集成可以直接在MakeCode环境中导入和使用,无需额外的配置和安装。 ## 安装使用步骤
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Python 框架:django Python版本:python3.8 数据库:mysql 5.7 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器
第三章-局域网-思维导图
内容概要:PT300机械故障综合模拟实验台由瓦仑尼安教学设备有限公司生产,旨在帮助用户深入了解振动特征知识及复杂转子振动频谱分析,实现精密振动分析和精准故障诊断。该实验台能模拟轴承故障、不平衡、不对中、设备松动、转子摩擦等多种机械故障现象,可进行不同转速下的轴承故障频率识别、转子静动平衡模拟试验、设备启停机测试等实验。设备采用高效节能ABB三相交流电动机,配备高精度转速控制和测量模块,确保运行稳定。此外,实验台还设有透明防震安全罩和互锁开关,保障实验安全。; 适合人群:高校师生、科研人员等需要学习或研究机械故障诊断相关理论知识和实践技能的人群。; 使用场景及目标:①用于高校等教育机构的教学,辅助学生理解机械故障诊断的理论知识和实践技能;②满足科研人员进行机械故障诊断算法验证、故障特征分析等科研需求。; 其他说明:PT300机械故障综合模拟实验台的每个部件均经过高精度加工,确保在不同振动状态下稳定运行。用户可根据期望分析特定部件的故障特征。设备尺寸为735mm(长)×310mm(宽)×350mm(高),保修一年,且提供免费操作指导服务。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
内容概要:本文详细介绍了使用COMSOL Multiphysics的弱形式接口对三维光子晶体进行数值模拟的方法和技巧。文章通过具体的代码示例,解释了如何构建光子晶体的介电常数分布、设置弱形式PDE、处理电磁场切向连续性、应用Floquet周期边界条件以及特征值求解等关键步骤。特别强调了弱形式接口相比传统物理场接口的优势,如灵活性和对复杂边界的处理能力。文中还分享了一些实用的经验和注意事项,如布洛赫边界条件的实现、特征值求解器参数的优化配置以及网格划分的技巧。 适合人群:具备一定电磁学和数值模拟基础的研究人员或工程师,尤其是对光子晶体仿真感兴趣的读者。 使用场景及目标:①理解并掌握COMSOL弱形式接口在光子晶体仿真中的应用;②学习如何通过弱形式设置处理复杂的电磁场问题;③提高对光子晶体能带结构和带隙特性的认识;④掌握特征值求解和网格划分的最佳实践。 阅读建议:由于本文涉及较多的具体代码和物理概念,建议读者在阅读过程中结合COMSOL软件进行实际操作,同时查阅相关电磁理论书籍以加深理解。此外,对于文中提到的一些具体参数设置和技巧,可以通过尝试不同的配置来巩固所学知识。
# 基于Arduino平台的INSPTComputacion2项目 ## 项目简介 INSPTComputacion2是一个基于Arduino平台的开发项目。该项目旨在通过Arduino的硬件和软件能力,实现一系列计算和交互功能。通过此项目,用户可以体验到Arduino在嵌入式系统、物联网和微控制器等领域的强大功能。 ## 项目的主要特性和功能 该项目的主要特性和功能包括但不限于以下几点 1. 嵌入式系统开发利用Arduino的硬件资源,开发嵌入式系统应用。 2. 物联网应用实现Arduino与物联网技术的结合,进行数据采集、传输和控制。 3. 交互设计通过Arduino实现人机交互,如按钮控制、LED显示等。 4. 数据处理利用Arduino进行数据处理和分析,如温度、湿度等环境数据的采集和处理。 ## 安装使用步骤 以下是在已下载本项目源码文件后的安装使用步骤 1. 确保已安装Arduino IDE软件。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
Python数据结构-学习笔记
该系统展示了一个电影在线购票系统的结构图,系统分为前台和后台两部分。前台包括首页、影院信息、电影信息、电影资讯和个人中心等模块,主要面向普通用户,提供电影浏览、选座购票、个人账户管理等功能。后台部分由管理员通过后台模块进行操作,包括系统首页、用户管理、场次管理、时间段管理、影院信息管理、电影分类管理、电影信息管理、订单管理和个人中心等模块,用于系统的维护和管理,如用户信息维护、电影和影院信息更新、订单处理等。整个系统旨在为用户提供便捷的在线购票体验,同时确保后台管理的高效和有序。
5G NR射频一致性自测用例 由于NR射频测试场景太多,全指标自动化跑测用时太久,本表格选取了主要场景的关键指标,以便于射频工程师对产品的NR射频指标进行初步摸底。 表格每一页概况: 1、NR TDD摸底指标N77/78/79/41 2、NR FDD摸底指标N1/3//5/8/28 附录1、各频段带宽所支持的SCS 附录2、各带宽SCS的RB配置 附录3、灵敏度测试的RB配置 附录4、摸底测试信道查询 附录5、各频段频率范围
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
软件介绍: 一个永久免费且无广告的邮件群发软件,直接使用SMTP来群发邮件支持添加多个发信邮箱,一个小而美的邮件群发软件。 开发这个软件最初是打算用QQ获取某个群所有的群成员QQ,然后转换为QQ邮箱群发偷人的,结果现在发现QQ已经限制到只能是该群管理员、群主才可以获取群成员所有QQ了,所以获取群成员所有QQ邮箱的功能就没有上线了。 支持导入TXT文件一行一个邮箱、粘贴邮箱、查看邮箱列表、SMTP发信邮箱(支持多个)、管理SMTP邮箱、单个发信邮箱限制发送次数